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>
maint
parent
f447a499db
commit
9202489174
|
|
@ -94,6 +94,46 @@ static void process_gitlink(struct traversal_context *ctx,
|
||||||
/* Nothing to do */
|
/* 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,
|
static void process_tree(struct traversal_context *ctx,
|
||||||
struct tree *tree,
|
struct tree *tree,
|
||||||
struct strbuf *base,
|
struct strbuf *base,
|
||||||
|
|
@ -101,10 +141,6 @@ static void process_tree(struct traversal_context *ctx,
|
||||||
{
|
{
|
||||||
struct object *obj = &tree->object;
|
struct object *obj = &tree->object;
|
||||||
struct rev_info *revs = ctx->revs;
|
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;
|
int baselen = base->len;
|
||||||
enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW;
|
enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW;
|
||||||
int gently = revs->ignore_missing_links ||
|
int gently = revs->ignore_missing_links ||
|
||||||
|
|
@ -144,29 +180,7 @@ static void process_tree(struct traversal_context *ctx,
|
||||||
if (base->len)
|
if (base->len)
|
||||||
strbuf_addch(base, '/');
|
strbuf_addch(base, '/');
|
||||||
|
|
||||||
init_tree_desc(&desc, tree->buffer, tree->size);
|
process_tree_contents(ctx, tree, base);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(obj->flags & USER_GIVEN) && ctx->filter_fn) {
|
if (!(obj->flags & USER_GIVEN) && ctx->filter_fn) {
|
||||||
r = ctx->filter_fn(LOFS_END_TREE, obj,
|
r = ctx->filter_fn(LOFS_END_TREE, obj,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue