]> git.ipfire.org Git - thirdparty/git.git/commitdiff
list-objects: refactor to process_tree_contents
authorMatthew DeVore <matvore@google.com>
Mon, 13 Aug 2018 18:14:29 +0000 (11:14 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 13 Aug 2018 22:17:32 +0000 (15:17 -0700)
This will be used in a follow-up patch to reduce indentation needed when
invoking the logic conditionally. i.e. rather than:

if (foo) {
while (...) {
/* this is very indented */
}
}

we will have:

if (foo)
process_tree_contents(...);

Signed-off-by: Matthew DeVore <matvore@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
list-objects.c

index 584518a3fade48bce872fc5a4c09b97b286f43d2..ccc529e5e3e690cb9f5815e27d47cff3f7e9e7bf 100644 (file)
@@ -94,6 +94,46 @@ static void process_gitlink(struct traversal_context *ctx,
        /* Nothing to do */
 }
 
+static void process_tree(struct traversal_context *ctx,
+                        struct tree *tree,
+                        struct strbuf *base,
+                        const char *name);
+
+static void process_tree_contents(struct traversal_context *ctx,
+                                 struct tree *tree,
+                                 struct strbuf *base)
+{
+       struct tree_desc desc;
+       struct name_entry entry;
+       enum interesting match = ctx->revs->diffopt.pathspec.nr == 0 ?
+               all_entries_interesting : entry_not_interesting;
+
+       init_tree_desc(&desc, tree->buffer, tree->size);
+
+       while (tree_entry(&desc, &entry)) {
+               if (match != all_entries_interesting) {
+                       match = tree_entry_interesting(&entry, base, 0,
+                                                      &ctx->revs->diffopt.pathspec);
+                       if (match == all_entries_not_interesting)
+                               break;
+                       if (match == entry_not_interesting)
+                               continue;
+               }
+
+               if (S_ISDIR(entry.mode))
+                       process_tree(ctx,
+                                    lookup_tree(the_repository, entry.oid),
+                                    base, entry.path);
+               else if (S_ISGITLINK(entry.mode))
+                       process_gitlink(ctx, entry.oid->hash,
+                                       base, entry.path);
+               else
+                       process_blob(ctx,
+                                    lookup_blob(the_repository, entry.oid),
+                                    base, entry.path);
+       }
+}
+
 static void process_tree(struct traversal_context *ctx,
                         struct tree *tree,
                         struct strbuf *base,
@@ -101,10 +141,6 @@ static void process_tree(struct traversal_context *ctx,
 {
        struct object *obj = &tree->object;
        struct rev_info *revs = ctx->revs;
-       struct tree_desc desc;
-       struct name_entry entry;
-       enum interesting match = revs->diffopt.pathspec.nr == 0 ?
-               all_entries_interesting: entry_not_interesting;
        int baselen = base->len;
        enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW;
        int gently = revs->ignore_missing_links ||
@@ -144,29 +180,7 @@ static void process_tree(struct traversal_context *ctx,
        if (base->len)
                strbuf_addch(base, '/');
 
-       init_tree_desc(&desc, tree->buffer, tree->size);
-
-       while (tree_entry(&desc, &entry)) {
-               if (match != all_entries_interesting) {
-                       match = tree_entry_interesting(&entry, base, 0,
-                                                      &revs->diffopt.pathspec);
-                       if (match == all_entries_not_interesting)
-                               break;
-                       if (match == entry_not_interesting)
-                               continue;
-               }
-
-               if (S_ISDIR(entry.mode))
-                       process_tree(ctx,
-                                    lookup_tree(the_repository, entry.oid),
-                                    base, entry.path);
-               else if (S_ISGITLINK(entry.mode))
-                       process_gitlink(ctx, entry.oid->hash, base, entry.path);
-               else
-                       process_blob(ctx,
-                                    lookup_blob(the_repository, entry.oid),
-                                    base, entry.path);
-       }
+       process_tree_contents(ctx, tree, base);
 
        if (!(obj->flags & USER_GIVEN) && ctx->filter_fn) {
                r = ctx->filter_fn(LOFS_END_TREE, obj,