hgfs: update index

This commit is contained in:
cinap_lenrek 2011-06-27 05:43:25 +00:00
parent fff6d18d51
commit 637a770a16
4 changed files with 19 additions and 7 deletions

View file

@ -36,6 +36,8 @@ struct Revlog
int ifd; int ifd;
int dfd; int dfd;
vlong ioff;
int nmap; int nmap;
Revmap *map; Revmap *map;
}; };

View file

@ -13,6 +13,7 @@ int funzip(int ofd, int zfd, int len);
/* revlog */ /* revlog */
int fmktemp(void); int fmktemp(void);
int revlogopen(Revlog *r, char *path, int mode); int revlogopen(Revlog *r, char *path, int mode);
void revlogupdate(Revlog *r);
void revlogclose(Revlog *r); void revlogclose(Revlog *r);
int revlogextract(Revlog *r, int rev, int ofd); int revlogextract(Revlog *r, int rev, int ofd);
uchar *revhash(Revlog *r, int rev); uchar *revhash(Revlog *r, int rev);

View file

@ -311,6 +311,9 @@ fswalk1(Fid *fid, char *name, Qid *qid)
} else { } else {
switch(rf->level){ switch(rf->level){
case Qroot: case Qroot:
revlogupdate(&changelog);
revlogupdate(&manifest);
i = findrev(&changelog, name); i = findrev(&changelog, name);
if(rf->info = getrevinfo(i)){ if(rf->info = getrevinfo(i)){
rf->level = Qrev; rf->level = Qrev;
@ -455,6 +458,9 @@ fsread(Req *r)
respond(r, "bug in fsread"); respond(r, "bug in fsread");
return; return;
case Qroot: case Qroot:
revlogupdate(&changelog);
revlogupdate(&manifest);
dirread9p(r, rootgen, nil); dirread9p(r, rootgen, nil);
respond(r, nil); respond(r, nil);
return; return;

View file

@ -13,15 +13,16 @@ fmktemp(void)
return create(mktemp(temp), OTRUNC|ORCLOSE|ORDWR, 0666); return create(mktemp(temp), OTRUNC|ORCLOSE|ORDWR, 0666);
} }
static void void
readindex(Revlog *r) revlogupdate(Revlog *r)
{ {
uchar buf[64]; uchar buf[64];
Revmap *m; Revmap *m;
int rev; int rev;
seek(r->ifd, 0, 0); if(seek(r->ifd, r->ioff, 0) < 0)
for(rev=0;;rev++){ return;
for(rev=r->nmap;;rev++){
if(readn(r->ifd, buf, sizeof(buf)) != sizeof(buf)) if(readn(r->ifd, buf, sizeof(buf)) != sizeof(buf))
break; break;
if((rev % 16) == 0) if((rev % 16) == 0)
@ -48,8 +49,9 @@ readindex(Revlog *r)
if(r->dfd < 0){ if(r->dfd < 0){
m->hoff = seek(r->ifd, 0, 1); m->hoff = seek(r->ifd, 0, 1);
seek(r->ifd, m->hlen, 1); r->ioff = seek(r->ifd, m->hlen, 1);
} } else
r->ioff = seek(r->ifd, 0, 1);
} }
r->nmap = rev; r->nmap = rev;
} }
@ -67,9 +69,10 @@ revlogopen(Revlog *r, char *path, int mode)
path[strlen(path)-1] = 'd'; path[strlen(path)-1] = 'd';
r->dfd = open(path, mode); r->dfd = open(path, mode);
free(path); free(path);
r->ioff = 0;
r->nmap = 0; r->nmap = 0;
r->map = nil; r->map = nil;
readindex(r); revlogupdate(r);
return 0; return 0;
} }