hgfs: change semantics of log to contain only the file list

This commit is contained in:
cinap_lenrek 2011-06-27 10:07:19 +02:00
parent 402ee30714
commit d0485d345d
4 changed files with 43 additions and 23 deletions

View file

@ -63,6 +63,9 @@ struct Revinfo
char *who;
char *why;
long when;
vlong logoff;
vlong loglen;
};
struct Revtree

View file

@ -197,8 +197,7 @@ fsmkdir(Dir *d, int level, void *aux)
goto Strgen;
case Qlog:
ri = aux;
if((rev = hashrev(&changelog, ri->chash)) >= 0)
d->length = changelog.map[rev].flen;
d->length = ri->loglen;
goto Namegen;
case Qwho:
ri = aux;
@ -512,6 +511,11 @@ fsread(Req *r)
Revlog rl;
char *s;
int i, n;
vlong off;
int len;
off = r->ifcall.offset;
len = r->ifcall.count;
rf = r->fid->aux;
switch(rf->level){
@ -540,6 +544,11 @@ fsread(Req *r)
}
goto Strgen;
case Qlog:
if(off >= rf->info->loglen)
len = 0;
else if((off + len) >= rf->info->loglen)
len = rf->info->loglen - off;
off += rf->info->logoff;
if(rf->fd >= 0)
goto Fdgen;
if((rf->fd = revlogopentemp(&changelog, hashrev(&changelog, rf->info->chash))) < 0){
@ -580,7 +589,7 @@ fsread(Req *r)
}
revlogclose(&rl);
Fdgen:
if((n = pread(rf->fd, r->ofcall.data, r->ifcall.count, r->ifcall.offset)) < 0){
if((n = pread(rf->fd, r->ofcall.data, len, off)) < 0){
responderror(r);
return;
}

View file

@ -10,6 +10,7 @@ loadrevinfo(Revlog *changelog, int rev)
char buf[BUFSZ], *p, *e;
int fd, line, inmsg, n;
Revinfo *ri;
vlong off;
if((fd = revlogopentemp(changelog, rev)) < 0)
return nil;
@ -23,6 +24,7 @@ loadrevinfo(Revlog *changelog, int rev)
memmove(ri->chash, changelog->map[rev].hash, HASHSZ);
off = 0;
line = 0;
inmsg = 0;
p = buf;
@ -42,19 +44,25 @@ loadrevinfo(Revlog *changelog, int rev)
case 2:
ri->when = strtol(buf, nil, 10);
break;
case 3:
ri->logoff = off;
default:
if(!inmsg){
if(*buf == 0)
if(*buf == 0){
ri->loglen = off - ri->logoff;
inmsg = 1;
}
} else {
n = ri->why ? strlen(ri->why) : 0;
ri->why = realloc(ri->why, n + strlen(buf)+1);
strcpy(ri->why + n, buf);
}
}
p -= e - buf;
n = e - buf;
p -= n;
if(p > buf)
memmove(buf, e, p - buf);
off += n;
}
e = buf + BUFSZ;
}

View file

@ -201,41 +201,41 @@ loadchangestree(Revlog *changelog, Revlog *manifest, Revinfo *ri)
{
char buf[BUFSZ], *p, *e;
Hashstr *ht[256], *he, **hp;
int fd, done, line, n;
int fd, n;
Revtree *t;
vlong off;
if((fd = revlogopentemp(changelog, hashrev(changelog, ri->chash))) < 0)
return nil;
done = 0;
line = 0;
off = seek(fd, ri->logoff, 0);
if(off < 0){
close(fd);
return nil;
}
memset(ht, 0, sizeof(ht));
p = buf;
e = buf + BUFSZ;
while((n = read(fd, p, e - p)) > 0){
while((off - ri->logoff) < ri->loglen){
if((n = read(fd, p, e - p)) <= 0)
break;
p += n;
while((p > buf) && (e = memchr(buf, '\n', p - buf))){
*e++ = 0;
if(++line >= 4){
if(*buf == 0){
done = 1;
break;
}
he = malloc(sizeof(*he) + strlen(buf)+1);
hp = &ht[hashstr(strcpy(he->str, buf)) % nelem(ht)];
he->next = *hp;
*hp = he;
he = malloc(sizeof(*he) + strlen(buf)+1);
hp = &ht[hashstr(strcpy(he->str, buf)) % nelem(ht)];
he->next = *hp;
*hp = he;
}
p -= e - buf;
n = e - buf;
p -= n;
if(p > buf)
memmove(buf, e, p - buf);
off += n;
}
if(done)
break;
e = buf + BUFSZ;
}
close(fd);