cache-tree: implement cache_tree_find_path()
Given a 'struct cache_tree', it may be beneficial to navigate directly to a node within that corresponds to a given path name. Create cache_tree_find_path() for this function. It returns NULL when no such path exists. The implementation is adapted from do_invalidate_path() which does a similar search but also modifies the nodes it finds along the way. The method could be implemented simply using tail-recursion, but this while loop does the same thing. This new method is not currently used, but will be in an upcoming change. Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
9fadb373dd
commit
080ab56a46
27
cache-tree.c
27
cache-tree.c
@ -100,6 +100,33 @@ struct cache_tree_sub *cache_tree_sub(struct cache_tree *it, const char *path)
|
|||||||
return find_subtree(it, path, pathlen, 1);
|
return find_subtree(it, path, pathlen, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct cache_tree *cache_tree_find_path(struct cache_tree *it, const char *path)
|
||||||
|
{
|
||||||
|
const char *slash;
|
||||||
|
int namelen;
|
||||||
|
struct cache_tree_sub it_sub = {
|
||||||
|
.cache_tree = it,
|
||||||
|
};
|
||||||
|
struct cache_tree_sub *down = &it_sub;
|
||||||
|
|
||||||
|
while (down) {
|
||||||
|
slash = strchrnul(path, '/');
|
||||||
|
namelen = slash - path;
|
||||||
|
down->cache_tree->entry_count = -1;
|
||||||
|
if (!*slash) {
|
||||||
|
int pos;
|
||||||
|
pos = cache_tree_subtree_pos(down->cache_tree, path, namelen);
|
||||||
|
if (0 <= pos)
|
||||||
|
return down->cache_tree->down[pos]->cache_tree;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
down = find_subtree(it, path, namelen, 0);
|
||||||
|
path = slash + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static int do_invalidate_path(struct cache_tree *it, const char *path)
|
static int do_invalidate_path(struct cache_tree *it, const char *path)
|
||||||
{
|
{
|
||||||
/* a/b/c
|
/* a/b/c
|
||||||
|
@ -29,6 +29,8 @@ struct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);
|
|||||||
|
|
||||||
int cache_tree_subtree_pos(struct cache_tree *it, const char *path, int pathlen);
|
int cache_tree_subtree_pos(struct cache_tree *it, const char *path, int pathlen);
|
||||||
|
|
||||||
|
struct cache_tree *cache_tree_find_path(struct cache_tree *it, const char *path);
|
||||||
|
|
||||||
void cache_tree_write(struct strbuf *, struct cache_tree *root);
|
void cache_tree_write(struct strbuf *, struct cache_tree *root);
|
||||||
struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
|
struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user