X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=cache-tree.c;h=d9f7e1e3dd598d34e08d6370544b562daf4640d2;hb=refs%2Fheads%2Forigin;hp=e452238ba7db47c08bd732dd425cb3be4c8bd73d;hpb=0111ea38cbb9db0e4e245dcd5c86198186bab197;p=git.git diff --git a/cache-tree.c b/cache-tree.c index e452238b..d9f7e1e3 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -110,6 +110,10 @@ void cache_tree_invalidate_path(struct cache_tree *it, const char *path) int namelen; struct cache_tree_sub *down; +#if DEBUG + fprintf(stderr, "cache-tree invalidate <%s>\n", path); +#endif + if (!it) return; slash = strchr(path, '/'); @@ -335,7 +339,7 @@ static int update_one(struct cache_tree *it, offset += 20; #if DEBUG - fprintf(stderr, "cache-tree %o %.*s\n", + fprintf(stderr, "cache-tree update-one %o %.*s\n", mode, entlen, path + baselen); #endif } @@ -351,7 +355,7 @@ static int update_one(struct cache_tree *it, free(buffer); it->entry_count = i; #if DEBUG - fprintf(stderr, "cache-tree (%d ent, %d subtree) %s\n", + fprintf(stderr, "cache-tree update-one (%d ent, %d subtree) %s\n", it->entry_count, it->subtree_nr, sha1_to_hex(it->sha1)); #endif @@ -525,3 +529,29 @@ struct cache_tree *cache_tree_read(const char *buffer, unsigned long size) return NULL; /* not the whole tree */ return read_one(&buffer, &size); } + +struct cache_tree *cache_tree_find(struct cache_tree *it, const char *path) +{ + while (*path) { + const char *slash; + struct cache_tree_sub *sub; + + slash = strchr(path, '/'); + if (!slash) + slash = path + strlen(path); + /* between path and slash is the name of the + * subtree to look for. + */ + sub = find_subtree(it, path, slash - path, 0); + if (!sub) + return NULL; + it = sub->cache_tree; + if (slash) + while (*slash && *slash == '/') + slash++; + if (!slash || !*slash) + return it; /* prefix ended with slashes */ + path = slash; + } + return it; +}