[PATCH 02/16] list-objects: limit traversing within the given subtree if core.subtree is set
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
list-objects.c | 23 +++++++++++++++++------
1 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/list-objects.c b/list-objects.c
index 8953548..1b25b54 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -61,12 +61,15 @@ static void process_tree(struct rev_info *revs,
struct tree *tree,
show_object_fn show,
struct name_path *path,
- const char *name)
+ const char *name,
+ const char *subtree)
{
struct object *obj = &tree->object;
struct tree_desc desc;
struct name_entry entry;
struct name_path me;
+ const char *slash;
+ int subtree_len;
if (!revs->tree_objects)
return;
@@ -82,13 +85,21 @@ static void process_tree(struct rev_info *revs,
me.elem = name;
me.elem_len = strlen(name);
+ if (subtree) {
+ slash = strchr(subtree, '/');
+ subtree_len = slash ? slash - subtree : strlen(subtree);
+ }
+
init_tree_desc(&desc, tree->buffer, tree->size);
while (tree_entry(&desc, &entry)) {
- if (S_ISDIR(entry.mode))
- process_tree(revs,
- lookup_tree(entry.sha1),
- show, &me, entry.path);
+ if (S_ISDIR(entry.mode)) {
+ if (!subtree || !strncmp(entry.path, subtree, subtree_len))
+ process_tree(revs,
+ lookup_tree(entry.sha1),
+ show, &me, entry.path,
+ slash && slash[1] ? slash+1 : NULL);
+ }
else if (S_ISGITLINK(entry.mode))
process_gitlink(revs, entry.sha1,
show, &me, entry.path);
@@ -164,7 +175,7 @@ void traverse_commit_list(struct rev_info *revs,
}
if (obj->type == OBJ_TREE) {
process_tree(revs, (struct tree *)obj, show_object,
- NULL, name);
+ NULL, name, core_subtree);
continue;
}
if (obj->type == OBJ_BLOB) {
--
1.7.1.rc1.69.g24c2f7