about summary refs log tree commit diff
path: root/third_party/git/list-objects.c
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/list-objects.c')
-rw-r--r--third_party/git/list-objects.c59
1 files changed, 34 insertions, 25 deletions
diff --git a/third_party/git/list-objects.c b/third_party/git/list-objects.c
index e19589baa0..b5651ddd5b 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);
 }