hgfs: fix metaheader offset for log

This commit is contained in:
cinap_lenrek 2012-11-02 03:31:55 +01:00
parent ce59d96ee3
commit 5cb6be9ce3
2 changed files with 12 additions and 6 deletions

View file

@ -303,7 +303,9 @@ fsmkdir(Dir *d, int level, void *aux)
* BUG: this is not correct. mercurial might * BUG: this is not correct. mercurial might
* prefix the data log with random \1\n escaped * prefix the data log with random \1\n escaped
* metadata strings (see fmetaheader()) and the flen * metadata strings (see fmetaheader()) and the flen
* *includes* the metadata part. m( * *includes* the metadata part. we try to compensate
* for this once the revision got extracted and
* subtract the metadata header in fsstat().
*/ */
d->length = rl->map[rev].flen; d->length = rl->map[rev].flen;
} }
@ -353,6 +355,7 @@ fsattach(Req *r)
rf->rlog = nil; rf->rlog = nil;
rf->fd = -1; rf->fd = -1;
rf->doff = 0;
rf->buf = nil; rf->buf = nil;
r->fid->aux = rf; r->fid->aux = rf;
@ -368,8 +371,11 @@ fsstat(Req *r)
rf = r->fid->aux; rf = r->fid->aux;
if(rf->level < Qtree) if(rf->level < Qtree)
fsmkdir(&r->d, rf->level, rf->info); fsmkdir(&r->d, rf->level, rf->info);
else else {
fsmkdir(&r->d, rf->level, rf->node); fsmkdir(&r->d, rf->level, rf->node);
if(rf->level == Qtree)
r->d.length -= rf->doff;
}
respond(r, nil); respond(r, nil);
} }
@ -686,14 +692,13 @@ fsread(Req *r)
len = 0; len = 0;
else if((off + len) >= rf->info->loglen) else if((off + len) >= rf->info->loglen)
len = rf->info->loglen - off; len = rf->info->loglen - off;
off += rf->info->logoff;
if(rf->fd >= 0) if(rf->fd >= 0)
goto Fdgen; goto Fdgen;
if((rf->fd = revlogopentemp(&changelog, hashrev(&changelog, rf->info->chash))) < 0){ if((rf->fd = revlogopentemp(&changelog, hashrev(&changelog, rf->info->chash))) < 0){
responderror(r); responderror(r);
return; return;
} }
rf->doff = fmetaheader(rf->fd); rf->doff = rf->info->logoff;
goto Fdgen; goto Fdgen;
case Qwho: case Qwho:
s = rf->info->who; s = rf->info->who;

View file

@ -17,14 +17,15 @@ loadrevinfo(Revlog *changelog, int rev)
seek(fd, 0, 2); seek(fd, 0, 2);
write(fd, "\n", 1); write(fd, "\n", 1);
seek(fd, 0, 0);
off = fmetaheader(fd);
seek(fd, off, 0);
ri = malloc(sizeof(*ri)); ri = malloc(sizeof(*ri));
memset(ri, 0, sizeof(*ri)); memset(ri, 0, sizeof(*ri));
memmove(ri->chash, changelog->map[rev].hash, HASHSZ); memmove(ri->chash, changelog->map[rev].hash, HASHSZ);
off = 0;
line = 0; line = 0;
inmsg = 0; inmsg = 0;
p = buf; p = buf;