]> git.ipfire.org Git - thirdparty/git.git/commitdiff
list-objects: support filtering by tag and commit
authorPatrick Steinhardt <ps@pks.im>
Mon, 12 Apr 2021 13:37:35 +0000 (15:37 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Apr 2021 16:35:50 +0000 (09:35 -0700)
Object filters currently only support filtering blobs or trees based on
some criteria. This commit lays the foundation to also allow filtering
of tags and commits.

No change in behaviour is expected from this commit given that there are
no filters yet for those object types.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
list-objects-filter.c
list-objects-filter.h
list-objects.c

index 39e2f15333694933468f6af9bea6d9804251dfcb..0ebfa5296625a32258a91670877e1c72509047fe 100644 (file)
@@ -82,6 +82,16 @@ static enum list_objects_filter_result filter_blobs_none(
        default:
                BUG("unknown filter_situation: %d", filter_situation);
 
+       case LOFS_TAG:
+               assert(obj->type == OBJ_TAG);
+               /* always include all tag objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
+       case LOFS_COMMIT:
+               assert(obj->type == OBJ_COMMIT);
+               /* always include all commit objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
        case LOFS_BEGIN_TREE:
                assert(obj->type == OBJ_TREE);
                /* always include all tree objects */
@@ -173,6 +183,16 @@ static enum list_objects_filter_result filter_trees_depth(
        default:
                BUG("unknown filter_situation: %d", filter_situation);
 
+       case LOFS_TAG:
+               assert(obj->type == OBJ_TAG);
+               /* always include all tag objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
+       case LOFS_COMMIT:
+               assert(obj->type == OBJ_COMMIT);
+               /* always include all commit objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
        case LOFS_END_TREE:
                assert(obj->type == OBJ_TREE);
                filter_data->current_depth--;
@@ -267,6 +287,16 @@ static enum list_objects_filter_result filter_blobs_limit(
        default:
                BUG("unknown filter_situation: %d", filter_situation);
 
+       case LOFS_TAG:
+               assert(obj->type == OBJ_TAG);
+               /* always include all tag objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
+       case LOFS_COMMIT:
+               assert(obj->type == OBJ_COMMIT);
+               /* always include all commit objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
        case LOFS_BEGIN_TREE:
                assert(obj->type == OBJ_TREE);
                /* always include all tree objects */
@@ -371,6 +401,16 @@ static enum list_objects_filter_result filter_sparse(
        default:
                BUG("unknown filter_situation: %d", filter_situation);
 
+       case LOFS_TAG:
+               assert(obj->type == OBJ_TAG);
+               /* always include all tag objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
+       case LOFS_COMMIT:
+               assert(obj->type == OBJ_COMMIT);
+               /* always include all commit objects */
+               return LOFR_MARK_SEEN | LOFR_DO_SHOW;
+
        case LOFS_BEGIN_TREE:
                assert(obj->type == OBJ_TREE);
                dtype = DT_DIR;
index cfd784e203f30fa6d85980fb019e83c37cc935e2..9e98814111cee433ae4b3a31937ce076a5d902ca 100644 (file)
@@ -55,6 +55,8 @@ enum list_objects_filter_result {
 };
 
 enum list_objects_filter_situation {
+       LOFS_COMMIT,
+       LOFS_TAG,
        LOFS_BEGIN_TREE,
        LOFS_END_TREE,
        LOFS_BLOB
index a5a60301cb28d473423112a2f3daf1408a3359b7..7f404677d54ea962b42b4daeec996783d746cb34 100644 (file)
@@ -217,8 +217,15 @@ static void process_tag(struct traversal_context *ctx,
                        struct tag *tag,
                        const char *name)
 {
-       tag->object.flags |= SEEN;
-       ctx->show_object(&tag->object, name, ctx->show_data);
+       enum list_objects_filter_result r;
+
+       r = list_objects_filter__filter_object(ctx->revs->repo, LOFS_TAG,
+                                              &tag->object, NULL, NULL,
+                                              ctx->filter);
+       if (r & LOFR_MARK_SEEN)
+               tag->object.flags |= SEEN;
+       if (r & LOFR_DO_SHOW)
+               ctx->show_object(&tag->object, name, ctx->show_data);
 }
 
 static void mark_edge_parents_uninteresting(struct commit *commit,
@@ -368,6 +375,12 @@ static void do_traverse(struct traversal_context *ctx)
        strbuf_init(&csp, PATH_MAX);
 
        while ((commit = get_revision(ctx->revs)) != NULL) {
+               enum list_objects_filter_result r;
+
+               r = list_objects_filter__filter_object(ctx->revs->repo,
+                               LOFS_COMMIT, &commit->object,
+                               NULL, NULL, ctx->filter);
+
                /*
                 * an uninteresting boundary commit may not have its tree
                 * parsed yet, but we are not going to show them anyway
@@ -382,7 +395,11 @@ static void do_traverse(struct traversal_context *ctx)
                        die(_("unable to load root tree for commit %s"),
                              oid_to_hex(&commit->object.oid));
                }
-               ctx->show_commit(commit, ctx->show_data);
+
+               if (r & LOFR_MARK_SEEN)
+                       commit->object.flags |= SEEN;
+               if (r & LOFR_DO_SHOW)
+                       ctx->show_commit(commit, ctx->show_data);
 
                if (ctx->revs->tree_blobs_in_commit_order)
                        /*