]> git.ipfire.org Git - thirdparty/git.git/blobdiff - list-objects.c
Merge branch 'gc/branch-recurse-submodules-fix'
[thirdparty/git.git] / list-objects.c
index 2f623f8211534dabe732b1da140a2512a5a5fcf5..250d9de41cb56072e95420530b203ce417191a2b 100644 (file)
@@ -21,6 +21,23 @@ struct traversal_context {
        struct filter *filter;
 };
 
+static void show_commit(struct traversal_context *ctx,
+                       struct commit *commit)
+{
+       if (!ctx->show_commit)
+               return;
+       ctx->show_commit(commit, ctx->show_data);
+}
+
+static void show_object(struct traversal_context *ctx,
+                       struct object *object,
+                       const char *name)
+{
+       if (!ctx->show_object)
+               return;
+       ctx->show_object(object, name, ctx->show_data);
+}
+
 static void process_blob(struct traversal_context *ctx,
                         struct blob *blob,
                         struct strbuf *path,
@@ -60,7 +77,7 @@ static void process_blob(struct traversal_context *ctx,
        if (r & LOFR_MARK_SEEN)
                obj->flags |= SEEN;
        if (r & LOFR_DO_SHOW)
-               ctx->show_object(obj, path->buf, ctx->show_data);
+               show_object(ctx, obj, path->buf);
        strbuf_setlen(path, pathlen);
 }
 
@@ -194,7 +211,7 @@ static void process_tree(struct traversal_context *ctx,
        if (r & LOFR_MARK_SEEN)
                obj->flags |= SEEN;
        if (r & LOFR_DO_SHOW)
-               ctx->show_object(obj, base->buf, ctx->show_data);
+               show_object(ctx, obj, base->buf);
        if (base->len)
                strbuf_addch(base, '/');
 
@@ -210,7 +227,7 @@ static void process_tree(struct traversal_context *ctx,
        if (r & LOFR_MARK_SEEN)
                obj->flags |= SEEN;
        if (r & LOFR_DO_SHOW)
-               ctx->show_object(obj, base->buf, ctx->show_data);
+               show_object(ctx, obj, base->buf);
 
        strbuf_setlen(base, baselen);
        free_tree_buffer(tree);
@@ -228,7 +245,7 @@ static void process_tag(struct traversal_context *ctx,
        if (r & LOFR_MARK_SEEN)
                tag->object.flags |= SEEN;
        if (r & LOFR_DO_SHOW)
-               ctx->show_object(&tag->object, name, ctx->show_data);
+               show_object(ctx, &tag->object, name);
 }
 
 static void mark_edge_parents_uninteresting(struct commit *commit,
@@ -402,7 +419,7 @@ static void do_traverse(struct traversal_context *ctx)
                if (r & LOFR_MARK_SEEN)
                        commit->object.flags |= SEEN;
                if (r & LOFR_DO_SHOW)
-                       ctx->show_commit(commit, ctx->show_data);
+                       show_commit(ctx, commit);
 
                if (ctx->revs->tree_blobs_in_commit_order)
                        /*
@@ -416,35 +433,25 @@ static void do_traverse(struct traversal_context *ctx)
        strbuf_release(&csp);
 }
 
-void traverse_commit_list(struct rev_info *revs,
-                         show_commit_fn show_commit,
-                         show_object_fn show_object,
-                         void *show_data)
-{
-       struct traversal_context ctx;
-       ctx.revs = revs;
-       ctx.show_commit = show_commit;
-       ctx.show_object = show_object;
-       ctx.show_data = show_data;
-       ctx.filter = NULL;
-       do_traverse(&ctx);
-}
-
 void traverse_commit_list_filtered(
-       struct list_objects_filter_options *filter_options,
        struct rev_info *revs,
        show_commit_fn show_commit,
        show_object_fn show_object,
        void *show_data,
        struct oidset *omitted)
 {
-       struct traversal_context ctx;
+       struct traversal_context ctx = {
+               .revs = revs,
+               .show_object = show_object,
+               .show_commit = show_commit,
+               .show_data = show_data,
+       };
+
+       if (revs->filter.choice)
+               ctx.filter = list_objects_filter__init(omitted, &revs->filter);
 
-       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);
        do_traverse(&ctx);
-       list_objects_filter__free(ctx.filter);
+
+       if (ctx.filter)
+               list_objects_filter__free(ctx.filter);
 }