summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew DeVore <matvore@google.com>2018-08-13 18:14:29 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-08-13 22:17:32 (GMT)
commit9202489174a110f82867edbac601f12480a4e284 (patch)
treebef393e233dcc48abc2099a888423721105269b7
parentf447a499dbb8be3a9f76f8099938129c74fcbd32 (diff)
downloadgit-9202489174a110f82867edbac601f12480a4e284.zip
git-9202489174a110f82867edbac601f12480a4e284.tar.gz
git-9202489174a110f82867edbac601f12480a4e284.tar.bz2
list-objects: refactor to process_tree_contents
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>
-rw-r--r--list-objects.c68
1 files changed, 41 insertions, 27 deletions
diff --git a/list-objects.c b/list-objects.c
index 584518a..ccc529e 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -97,14 +97,50 @@ static void process_gitlink(struct traversal_context *ctx,
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,
const char *name)
{
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,