]> git.lizzy.rs Git - plan9front.git/commitdiff
hgfs: fix metaheader offset for log
authorcinap_lenrek <cinap_lenrek@gmx.de>
Fri, 2 Nov 2012 02:31:55 +0000 (03:31 +0100)
committercinap_lenrek <cinap_lenrek@gmx.de>
Fri, 2 Nov 2012 02:31:55 +0000 (03:31 +0100)
sys/src/cmd/hgfs/fs.c
sys/src/cmd/hgfs/info.c

index 7f9c37d6afac3e5d48d873a13a12abd80d149dfe..9c61233c36139cb95fc1bd54c15145900b334518 100644 (file)
@@ -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;
index 2f0d010757e17f3b97635d374f3ab448ee48c5a7..6a17a8fcc7c392e8486c00d4225b5187cfb1d424 100644 (file)
@@ -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;