]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/cat-file: mark 'git cat-file' sparse-index compatible
authorKevin Lyles <klyles+github@epic.com>
Tue, 3 Sep 2024 22:06:47 +0000 (22:06 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 4 Sep 2024 16:19:04 +0000 (09:19 -0700)
This change affects how 'git cat-file' works with the index when
specifying an object with the ":<path>" syntax (which will give file
contents from the index).

'git cat-file' expands a sparse index to a full index any time contents
are requested from the index by specifying an object with the ":<path>"
syntax. This is true even when the requested file is part of the sparse
index, and results in much slower 'git cat-file' operations when working
within the sparse index.

Mark 'git cat-file' as not needing a full index, so that you only pay
the cost of expanding the sparse index to a full index when you request
a file outside of the sparse index.

Add tests to ensure both that:
- 'git cat-file' returns the correct file contents whether or not the
  file is in the sparse index
- 'git cat-file' expands to the full index any time you request
  something outside of the sparse index

Signed-off-by: Kevin Lyles <klyles+github@epic.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/cat-file.c
t/t1092-sparse-checkout-compatibility.sh

index 18fe58d6b8b043e182b50f6204c8803e32729845..1afdfb5cbae86309dea683114dba0be697bae794 100644 (file)
@@ -1047,6 +1047,9 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)
        if (batch.buffer_output < 0)
                batch.buffer_output = batch.all_objects;
 
+       prepare_repo_settings(the_repository);
+       the_repository->settings.command_requires_full_index = 0;
+
        /* Return early if we're in batch mode? */
        if (batch.enabled) {
                if (opt_cw)
index 4cbe9b1465d0fe9c687aa89d6e473d1483bd0c74..eb32da2a7f2ad6f14822278523849a8c67aa8476 100755 (executable)
@@ -2358,4 +2358,40 @@ test_expect_success 'advice.sparseIndexExpanded' '
        grep "The sparse index is expanding to a full index" err
 '
 
+test_expect_success 'cat-file -p' '
+       init_repos &&
+       echo "new content" >>full-checkout/deep/a &&
+       echo "new content" >>sparse-checkout/deep/a &&
+       echo "new content" >>sparse-index/deep/a &&
+       run_on_all git add deep/a &&
+
+       test_all_match git cat-file -p :deep/a &&
+       ensure_not_expanded cat-file -p :deep/a &&
+       test_all_match git cat-file -p :folder1/a &&
+       ensure_expanded cat-file -p :folder1/a
+'
+
+test_expect_success 'cat-file --batch' '
+       init_repos &&
+       echo "new content" >>full-checkout/deep/a &&
+       echo "new content" >>sparse-checkout/deep/a &&
+       echo "new content" >>sparse-index/deep/a &&
+       run_on_all git add deep/a &&
+
+       echo ":deep/a" >in &&
+       test_all_match git cat-file --batch <in &&
+       ensure_not_expanded cat-file --batch <in &&
+
+       echo ":folder1/a" >in &&
+       test_all_match git cat-file --batch <in &&
+       ensure_expanded cat-file --batch <in &&
+
+       cat >in <<-\EOF &&
+       :deep/a
+       :folder1/a
+       EOF
+       test_all_match git cat-file --batch <in &&
+       ensure_expanded cat-file --batch <in
+'
+
 test_done