diff options
Diffstat (limited to 'third_party/git/list-objects.c')
-rw-r--r-- | third_party/git/list-objects.c | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/third_party/git/list-objects.c b/third_party/git/list-objects.c index e19589baa045..b5651ddd5bfd 100644 --- a/third_party/git/list-objects.c +++ b/third_party/git/list-objects.c @@ -18,7 +18,8 @@ struct traversal_context { show_object_fn show_object; show_commit_fn show_commit; void *show_data; - struct filter *filter; + filter_object_fn filter_fn; + void *filter_data; }; static void process_blob(struct traversal_context *ctx, @@ -28,7 +29,7 @@ static void process_blob(struct traversal_context *ctx, { struct object *obj = &blob->object; size_t pathlen; - enum list_objects_filter_result r; + enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW; if (!ctx->revs->blob_objects) return; @@ -53,10 +54,11 @@ static void process_blob(struct traversal_context *ctx, pathlen = path->len; strbuf_addstr(path, name); - r = list_objects_filter__filter_object(ctx->revs->repo, - LOFS_BLOB, obj, - path->buf, &path->buf[pathlen], - ctx->filter); + 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); if (r & LOFR_MARK_SEEN) obj->flags |= SEEN; if (r & LOFR_DO_SHOW) @@ -155,7 +157,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; + enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW; int failed_parse; if (!revs->tree_objects) @@ -184,10 +186,11 @@ static void process_tree(struct traversal_context *ctx, } strbuf_addstr(base, name); - r = list_objects_filter__filter_object(ctx->revs->repo, - LOFS_BEGIN_TREE, obj, - base->buf, &base->buf[baselen], - ctx->filter); + 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); if (r & LOFR_MARK_SEEN) obj->flags |= SEEN; if (r & LOFR_DO_SHOW) @@ -200,14 +203,16 @@ static void process_tree(struct traversal_context *ctx, else if (!failed_parse) process_tree_contents(ctx, tree, base); - 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); + 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); + } strbuf_setlen(base, baselen); free_tree_buffer(tree); @@ -365,9 +370,7 @@ static void do_traverse(struct traversal_context *ctx) * an uninteresting boundary commit may not have its tree * parsed yet, but we are not going to show them anyway */ - if (!ctx->revs->tree_objects) - ; /* do not bother loading tree */ - else if (get_commit_tree(commit)) { + if (get_commit_tree(commit)) { struct tree *tree = get_commit_tree(commit); tree->object.flags |= NOT_USER_GIVEN; add_pending_tree(ctx->revs, tree); @@ -399,7 +402,8 @@ 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 = NULL; + ctx.filter_fn = NULL; + ctx.filter_data = NULL; do_traverse(&ctx); } @@ -412,12 +416,17 @@ 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 = list_objects_filter__init(omitted, filter_options); + ctx.filter_fn = NULL; + + ctx.filter_data = list_objects_filter__init(omitted, filter_options, + &ctx.filter_fn, &filter_free_fn); do_traverse(&ctx); - list_objects_filter__free(ctx.filter); + if (ctx.filter_data && filter_free_fn) + filter_free_fn(ctx.filter_data); } |