aboutsummaryrefslogtreecommitdiff
path: root/cache-tree.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-05-07 16:17:43 -0700
committerJunio C Hamano <junkio@cox.net>2006-05-07 16:17:43 -0700
commitb0121fb3f279a9cf13aff9da060e742aef3a83fa (patch)
tree26d975a964cbd7fcbc99e5fc4b1428e7b1d953e6 /cache-tree.c
parent7f498065e9bf85f6f3e954ec57dedf56fec29e01 (diff)
parent6bd20358a9b831b3b545284188871bc844245c25 (diff)
downloadgit-b0121fb3f279a9cf13aff9da060e742aef3a83fa.tar.gz
git-b0121fb3f279a9cf13aff9da060e742aef3a83fa.tar.xz
Merge branch 'jc/gitlink' into next
* jc/gitlink: write-tree: --prefix=<path> read-tree: --prefix=<path>/ option.
Diffstat (limited to 'cache-tree.c')
-rw-r--r--cache-tree.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/cache-tree.c b/cache-tree.c
index a880c97b3..d9f7e1e3d 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -529,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;
+}