list-objects-filter: encapsulate filter components
Encapsulate filter_fn, filter_free_fn, and filter_data into their own opaque struct. Due to opaqueness, filter_fn and filter_free_fn can no longer be accessed directly by users. Currently, all usages of filter_fn are guarded by a necessary check: (obj->flags & NOT_USER_GIVEN) && filter_fn Take the opportunity to include this check into the new function list_objects_filter__filter_object(), so that we no longer need to write this check at every caller of the filter function. Also, the init functions in list-objects-filter.c no longer need to confusingly return the filter constituents in various places (filter_fn and filter_free_fn as out parameters, and filter_data as the function's return value); they can just initialize the "struct filter" passed in. Helped-by: Jeff Hostetler <git@jeffhostetler.com> Helped-by: Jonathan Tan <jonathantanmy@google.com> Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Matthew DeVore <matvore@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
8dca754b1e
commit
9430147ca0
@ -18,8 +18,7 @@ struct traversal_context {
|
||||
show_object_fn show_object;
|
||||
show_commit_fn show_commit;
|
||||
void *show_data;
|
||||
filter_object_fn filter_fn;
|
||||
void *filter_data;
|
||||
struct filter *filter;
|
||||
};
|
||||
|
||||
static void process_blob(struct traversal_context *ctx,
|
||||
@ -29,7 +28,7 @@ static void process_blob(struct traversal_context *ctx,
|
||||
{
|
||||
struct object *obj = &blob->object;
|
||||
size_t pathlen;
|
||||
enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW;
|
||||
enum list_objects_filter_result r;
|
||||
|
||||
if (!ctx->revs->blob_objects)
|
||||
return;
|
||||
@ -54,11 +53,10 @@ static void process_blob(struct traversal_context *ctx,
|
||||
|
||||
pathlen = path->len;
|
||||
strbuf_addstr(path, name);
|
||||
if ((obj->flags & NOT_USER_GIVEN) && ctx->filter_fn)
|
||||
r = ctx->filter_fn(ctx->revs->repo,
|
||||
LOFS_BLOB, obj,
|
||||
path->buf, &path->buf[pathlen],
|
||||
ctx->filter_data);
|
||||
r = list_objects_filter__filter_object(ctx->revs->repo,
|
||||
LOFS_BLOB, obj,
|
||||
path->buf, &path->buf[pathlen],
|
||||
ctx->filter);
|
||||
if (r & LOFR_MARK_SEEN)
|
||||
obj->flags |= SEEN;
|
||||
if (r & LOFR_DO_SHOW)
|
||||
@ -157,7 +155,7 @@ static void process_tree(struct traversal_context *ctx,
|
||||
struct object *obj = &tree->object;
|
||||
struct rev_info *revs = ctx->revs;
|
||||
int baselen = base->len;
|
||||
enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW;
|
||||
enum list_objects_filter_result r;
|
||||
int failed_parse;
|
||||
|
||||
if (!revs->tree_objects)
|
||||
@ -186,11 +184,10 @@ static void process_tree(struct traversal_context *ctx,
|
||||
}
|
||||
|
||||
strbuf_addstr(base, name);
|
||||
if ((obj->flags & NOT_USER_GIVEN) && ctx->filter_fn)
|
||||
r = ctx->filter_fn(ctx->revs->repo,
|
||||
LOFS_BEGIN_TREE, obj,
|
||||
base->buf, &base->buf[baselen],
|
||||
ctx->filter_data);
|
||||
r = list_objects_filter__filter_object(ctx->revs->repo,
|
||||
LOFS_BEGIN_TREE, obj,
|
||||
base->buf, &base->buf[baselen],
|
||||
ctx->filter);
|
||||
if (r & LOFR_MARK_SEEN)
|
||||
obj->flags |= SEEN;
|
||||
if (r & LOFR_DO_SHOW)
|
||||
@ -203,16 +200,14 @@ static void process_tree(struct traversal_context *ctx,
|
||||
else if (!failed_parse)
|
||||
process_tree_contents(ctx, tree, base);
|
||||
|
||||
if ((obj->flags & NOT_USER_GIVEN) && ctx->filter_fn) {
|
||||
r = ctx->filter_fn(ctx->revs->repo,
|
||||
LOFS_END_TREE, obj,
|
||||
base->buf, &base->buf[baselen],
|
||||
ctx->filter_data);
|
||||
if (r & LOFR_MARK_SEEN)
|
||||
obj->flags |= SEEN;
|
||||
if (r & LOFR_DO_SHOW)
|
||||
ctx->show_object(obj, base->buf, ctx->show_data);
|
||||
}
|
||||
r = list_objects_filter__filter_object(ctx->revs->repo,
|
||||
LOFS_END_TREE, obj,
|
||||
base->buf, &base->buf[baselen],
|
||||
ctx->filter);
|
||||
if (r & LOFR_MARK_SEEN)
|
||||
obj->flags |= SEEN;
|
||||
if (r & LOFR_DO_SHOW)
|
||||
ctx->show_object(obj, base->buf, ctx->show_data);
|
||||
|
||||
strbuf_setlen(base, baselen);
|
||||
free_tree_buffer(tree);
|
||||
@ -402,8 +397,7 @@ void traverse_commit_list(struct rev_info *revs,
|
||||
ctx.show_commit = show_commit;
|
||||
ctx.show_object = show_object;
|
||||
ctx.show_data = show_data;
|
||||
ctx.filter_fn = NULL;
|
||||
ctx.filter_data = NULL;
|
||||
ctx.filter = NULL;
|
||||
do_traverse(&ctx);
|
||||
}
|
||||
|
||||
@ -416,17 +410,12 @@ void traverse_commit_list_filtered(
|
||||
struct oidset *omitted)
|
||||
{
|
||||
struct traversal_context ctx;
|
||||
filter_free_fn filter_free_fn = NULL;
|
||||
|
||||
ctx.revs = revs;
|
||||
ctx.show_object = show_object;
|
||||
ctx.show_commit = show_commit;
|
||||
ctx.show_data = show_data;
|
||||
ctx.filter_fn = NULL;
|
||||
|
||||
ctx.filter_data = list_objects_filter__init(omitted, filter_options,
|
||||
&ctx.filter_fn, &filter_free_fn);
|
||||
ctx.filter = list_objects_filter__init(omitted, filter_options);
|
||||
do_traverse(&ctx);
|
||||
if (ctx.filter_data && filter_free_fn)
|
||||
filter_free_fn(ctx.filter_data);
|
||||
list_objects_filter__free(ctx.filter);
|
||||
}
|
||||
|
Reference in New Issue
Block a user