summaryrefslogtreecommitdiff
path: root/list-objects.c
diff options
context:
space:
mode:
authorMatthew DeVore <matvore@google.com>2018-10-18 00:39:15 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-10-18 03:49:18 (GMT)
commit8b10a206f090e01ce1ac4d9a10ec769e2409e2b0 (patch)
tree13308fe2d78d914e6e5548d144c4368b5980c471 /list-objects.c
parentd9e6d0942bb9f9fe9e4cca9670181e5b59074bcb (diff)
downloadgit-8b10a206f090e01ce1ac4d9a10ec769e2409e2b0.zip
git-8b10a206f090e01ce1ac4d9a10ec769e2409e2b0.tar.gz
git-8b10a206f090e01ce1ac4d9a10ec769e2409e2b0.tar.bz2
list-objects: support for skipping tree traversal
The tree:0 filter does not need to traverse the trees that it has filtered out, so optimize list-objects and list-objects-filter to skip traversing the trees entirely. Before this patch, we iterated over all children of the tree, and did nothing for all of them, which was wasteful. Signed-off-by: Matthew DeVore <matvore@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'list-objects.c')
-rw-r--r--list-objects.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/list-objects.c b/list-objects.c
index 7a1a092..d1e3d21 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -11,6 +11,7 @@
#include "list-objects-filter-options.h"
#include "packfile.h"
#include "object-store.h"
+#include "trace.h"
struct traversal_context {
struct rev_info *revs;
@@ -184,7 +185,9 @@ static void process_tree(struct traversal_context *ctx,
if (base->len)
strbuf_addch(base, '/');
- if (!failed_parse)
+ if (r & LOFR_SKIP_TREE)
+ trace_printf("Skipping contents of tree %s...\n", base->buf);
+ else if (!failed_parse)
process_tree_contents(ctx, tree, base);
if ((obj->flags & NOT_USER_GIVEN) && ctx->filter_fn) {