]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/cat-file: support "object:type=" objects filter
authorPatrick Steinhardt <ps@pks.im>
Wed, 2 Apr 2025 11:13:41 +0000 (13:13 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Apr 2025 21:43:51 +0000 (14:43 -0700)
Implement support for the "object:type=" filter in git-cat-file(1),
which causes us to omit all objects that don't match the provided object
type.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-cat-file.adoc
builtin/cat-file.c
t/t1006-cat-file.sh

index 48e05e1af52253baca8d1b15840953de07977d4f..74d71c3282efbd48c55ea8807bc143b690bcb0c4 100644 (file)
@@ -96,6 +96,9 @@ The form '--filter=blob:limit=<n>[kmg]' omits blobs of size at least n
 bytes or units.  n may be zero.  The suffixes k, m, and g can be used to name
 units in KiB, MiB, or GiB.  For example, 'blob:limit=1k' is the same as
 'blob:limit=1024'.
++
+The form '--filter=object:type=(tag|commit|tree|blob)' omits all objects which
+are not of the requested type.
 
 --path=<path>::
        For use with `--textconv` or `--filters`, to allow specifying an object
index 629c6cddcb2239f4c4bddaa590ae72bcfe9b7878..0f17175a549ed2a1e27c5afe6b4b7a639a8aaf5e 100644 (file)
@@ -484,7 +484,8 @@ static void batch_object_write(const char *obj_name,
 
                if (use_mailmap ||
                    opt->objects_filter.choice == LOFC_BLOB_NONE ||
-                   opt->objects_filter.choice == LOFC_BLOB_LIMIT)
+                   opt->objects_filter.choice == LOFC_BLOB_LIMIT ||
+                   opt->objects_filter.choice == LOFC_OBJECT_TYPE)
                        data->info.typep = &data->type;
                if (opt->objects_filter.choice == LOFC_BLOB_LIMIT)
                        data->info.sizep = &data->size;
@@ -521,6 +522,14 @@ static void batch_object_write(const char *obj_name,
                                return;
                        }
                        break;
+               case LOFC_OBJECT_TYPE:
+                       if (data->type != opt->objects_filter.object_type) {
+                               if (!opt->all_objects)
+                                       report_object_status(opt, obj_name,
+                                                            &data->oid, "excluded");
+                               return;
+                       }
+                       break;
                default:
                        BUG("unsupported objects filter");
                }
@@ -1062,6 +1071,7 @@ int cmd_cat_file(int argc,
                break;
        case LOFC_BLOB_NONE:
        case LOFC_BLOB_LIMIT:
+       case LOFC_OBJECT_TYPE:
                if (!batch.enabled)
                        usage(_("objects filter only supported in batch mode"));
                break;
index 4f14840b71a15f05837efd850511e64baeab6c92..98638fa2b9c950a24180558c0fd702be0b532fe0 100755 (executable)
@@ -1388,7 +1388,7 @@ test_expect_success 'objects filter with unknown option' '
        test_cmp expect err
 '
 
-for option in object:type=tag sparse:oid=1234 tree:1 sparse:path=x
+for option in sparse:oid=1234 tree:1 sparse:path=x
 do
        test_expect_success "objects filter with unsupported option $option" '
                case "$option" in
@@ -1447,5 +1447,9 @@ test_objects_filter "blob:limit=1"
 test_objects_filter "blob:limit=500"
 test_objects_filter "blob:limit=1000"
 test_objects_filter "blob:limit=1k"
+test_objects_filter "object:type=blob"
+test_objects_filter "object:type=commit"
+test_objects_filter "object:type=tag"
+test_objects_filter "object:type=tree"
 
 test_done