From 5cb6be9ce3bb53909879d6911cc2411f8458ed10 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 2 Nov 2012 03:31:55 +0100 Subject: [PATCH] hgfs: fix metaheader offset for log --- sys/src/cmd/hgfs/fs.c | 13 +++++++++---- sys/src/cmd/hgfs/info.c | 5 +++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sys/src/cmd/hgfs/fs.c b/sys/src/cmd/hgfs/fs.c index 7f9c37d6a..9c61233c3 100644 --- a/sys/src/cmd/hgfs/fs.c +++ b/sys/src/cmd/hgfs/fs.c @@ -303,7 +303,9 @@ fsmkdir(Dir *d, int level, void *aux) * BUG: this is not correct. mercurial might * prefix the data log with random \1\n escaped * 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; } @@ -353,6 +355,7 @@ fsattach(Req *r) rf->rlog = nil; rf->fd = -1; + rf->doff = 0; rf->buf = nil; r->fid->aux = rf; @@ -368,8 +371,11 @@ fsstat(Req *r) rf = r->fid->aux; if(rf->level < Qtree) fsmkdir(&r->d, rf->level, rf->info); - else + else { fsmkdir(&r->d, rf->level, rf->node); + if(rf->level == Qtree) + r->d.length -= rf->doff; + } respond(r, nil); } @@ -686,14 +692,13 @@ fsread(Req *r) 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){ responderror(r); return; } - rf->doff = fmetaheader(rf->fd); + rf->doff = rf->info->logoff; goto Fdgen; case Qwho: s = rf->info->who; diff --git a/sys/src/cmd/hgfs/info.c b/sys/src/cmd/hgfs/info.c index 2f0d01075..6a17a8fcc 100644 --- a/sys/src/cmd/hgfs/info.c +++ b/sys/src/cmd/hgfs/info.c @@ -17,14 +17,15 @@ loadrevinfo(Revlog *changelog, int rev) seek(fd, 0, 2); write(fd, "\n", 1); - seek(fd, 0, 0); + + off = fmetaheader(fd); + seek(fd, off, 0); ri = malloc(sizeof(*ri)); memset(ri, 0, sizeof(*ri)); memmove(ri->chash, changelog->map[rev].hash, HASHSZ); - off = 0; line = 0; inmsg = 0; p = buf;