summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/cmd/hgfs/fs.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/sys/src/cmd/hgfs/fs.c b/sys/src/cmd/hgfs/fs.c
index ab820f656..09644b8a5 100644
--- a/sys/src/cmd/hgfs/fs.c
+++ b/sys/src/cmd/hgfs/fs.c
@@ -606,6 +606,19 @@ fsopen(Req *r)
if(rf->node == nil || rf->node->mode != 'x')
break;
case OREAD:
+ if(rf->level == Qlog){
+ if((rf->fd = revlogopentemp(&changelog, hashrev(&changelog, rf->info->chash))) < 0){
+ responderror(r);
+ return;
+ }
+ rf->doff = rf->info->logoff;
+ } else if(rf->level == Qtree && rf->node->down == nil){
+ if((rf->fd = revlogopentemp(rf->rlog, hashrev(rf->rlog, rf->node->hash))) < 0){
+ responderror(r);
+ return;
+ }
+ rf->doff = fmetaheader(rf->fd);
+ }
respond(r, nil);
return;
}
@@ -697,13 +710,6 @@ fsread(Req *r)
len = 0;
else if((off + len) >= rf->info->loglen)
len = rf->info->loglen - off;
- if(rf->fd >= 0)
- goto Fdgen;
- if((rf->fd = revlogopentemp(&changelog, hashrev(&changelog, rf->info->chash))) < 0){
- responderror(r);
- return;
- }
- rf->doff = rf->info->logoff;
goto Fdgen;
case Qwho:
s = rf->info->who;
@@ -724,14 +730,9 @@ fsread(Req *r)
respond(r, nil);
return;
}
- if(rf->fd >= 0)
- goto Fdgen;
- if((rf->fd = revlogopentemp(rf->rlog, hashrev(rf->rlog, rf->node->hash))) < 0){
- responderror(r);
- return;
- }
- rf->doff = fmetaheader(rf->fd);
Fdgen:
+ if(rf->fd < 0)
+ break;
if((n = pread(rf->fd, r->ofcall.data, len, off + rf->doff)) < 0){
responderror(r);
return;