+ if(nd == nil){
+ if(sname == name){
+ sname = strrchr(name, '.');
+ if((i = sname - name) > 0){
+ sname++;
+ if(strncmp(sname, "rev", 3) == 0){
+ level = Qtreerev;
+ sname += 3;
+ }
+ snprint(path, sizeof(path), "%.*s", i, name);
+ i = atoi(sname);
+ sname = path;
+ goto Searchtree;
+ }
+ }
+ goto Notfound;
+ }
+ if(nd->hash){
+ Revnode *nb;
+ int j;
+
+ if((rf->rlog = getrevlog(nd)) == nil)
+ goto Notfound;
+ j = hashrev(rf->rlog, nd->hash) - i;
+ if(i < 0 || j < 0 || j >= rf->rlog->nmap){
+ closerevlog(rf->rlog);
+ rf->rlog = nil;
+ goto Notfound;
+ }
+ for(nb = nd; nb; nb = nb->before)
+ if(hashrev(rf->rlog, nb->hash) == j)
+ break;
+ if(nb == nil){
+ nb = mknode(nd->name, revhash(rf->rlog, j), nd->mode);
+ nb->up = nd->up;
+ nb->before = nd->before;
+ nd->before = nb;
+ }
+ nd = nb;
+ } else if(i || level != Qtree)