diff options
author | Derrick Stolee <dstolee@microsoft.com> | 2022-05-23 15:48:41 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-05-23 20:08:21 +0200 |
commit | 080ab56a46ad65068201a768a04464341117fe81 (patch) | |
tree | 535123b9ca0e48b8be43a14ba4917d8e4f65e647 /cache-tree.c | |
parent | sparse-index: introduce partially-sparse indexes (diff) | |
download | git-080ab56a46ad65068201a768a04464341117fe81.tar.xz git-080ab56a46ad65068201a768a04464341117fe81.zip |
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>
Diffstat (limited to 'cache-tree.c')
-rw-r--r-- | cache-tree.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/cache-tree.c b/cache-tree.c index 6752f69d51..f42db920d1 100644 --- a/cache-tree.c +++ b/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); } +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) { /* a/b/c |