summaryrefslogtreecommitdiff
path: root/cache-tree.c
diff options
context:
space:
mode:
authorDerrick Stolee <dstolee@microsoft.com>2022-05-23 13:48:41 (GMT)
committerJunio C Hamano <gitster@pobox.com>2022-05-23 18:08:21 (GMT)
commit080ab56a46ad65068201a768a04464341117fe81 (patch)
tree535123b9ca0e48b8be43a14ba4917d8e4f65e647 /cache-tree.c
parent9fadb373dd4a670e761776560d3c40f6fcc80360 (diff)
downloadgit-080ab56a46ad65068201a768a04464341117fe81.zip
git-080ab56a46ad65068201a768a04464341117fe81.tar.gz
git-080ab56a46ad65068201a768a04464341117fe81.tar.bz2
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.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/cache-tree.c b/cache-tree.c
index 6752f69..f42db92 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