mirror of
https://github.com/git/git.git
synced 2024-05-30 09:06:07 +02:00
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>
This commit is contained in:
parent
f447a499db
commit
9202489174
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue