Skip to content

Commit 79134a4

Browse files
derrickstoleedscho
authored andcommitted
show: integrate with the sparse index
The 'git show' command can take an input to request the state of an object in the index. This can lead to parsing the index in order to load a specific file entry. Without the change presented here, a sparse index would expand to a full one, taking much longer than usual to access a simple file. There is one behavioral change that happens here, though: we now can find a sparse directory entry within the index! Commands that previously failed because we could not find an entry in the worktree or index now succeed because we _do_ find an entry in the index. There might be more work to do to make other situations succeed when looking for an indexed tree, perhaps by looking at or updating the cache-tree extension as needed. These situations include having a full index or asking for a directory that is within the sparse-checkout cone (and hence is not a sparse directory entry in the index). Signed-off-by: Derrick Stolee <[email protected]>
1 parent a7b3536 commit 79134a4

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

builtin/log.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,9 @@ int cmd_show(int argc, const char **argv, const char *prefix)
648648
init_log_defaults();
649649
git_config(git_log_config, NULL);
650650

651+
prepare_repo_settings(the_repository);
652+
the_repository->settings.command_requires_full_index = 0;
653+
651654
memset(&match_all, 0, sizeof(match_all));
652655
repo_init_revisions(the_repository, &rev, prefix);
653656
rev.diff = 1;

t/t1092-sparse-checkout-compatibility.sh

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,19 @@ test_expect_success 'show (cached blobs/trees)' '
12841284
# when the directory is outside of the cone.
12851285
test_all_match test_must_fail git show :deep/ &&
12861286
test_must_fail git -C full-checkout show :folder1/ &&
1287-
test_sparse_match test_must_fail git show :folder1/
1287+
test_must_fail git -C sparse-checkout show :folder1/ &&
1288+
1289+
# The sparse index actually has "folder1" inside, so
1290+
# "git show :folder1/" succeeds when it did not before.
1291+
git -C sparse-index show :folder1/ >actual &&
1292+
git -C sparse-index show HEAD:folder1 >expect &&
1293+
1294+
# The output of "git show" includes the way we
1295+
# referenced the objects, so strip that out.
1296+
test_line_count = 4 actual &&
1297+
tail -n 2 actual >actual-trunc &&
1298+
tail -n 2 expect >expect-trunc &&
1299+
test_cmp expect-trunc actual-trunc
12881300
'
12891301

12901302
test_expect_success 'submodule handling' '
@@ -1401,6 +1413,9 @@ test_expect_success 'sparse-index is not expanded' '
14011413
echo >>sparse-index/untracked.txt &&
14021414
ensure_not_expanded add . &&
14031415
1416+
ensure_not_expanded show :a &&
1417+
ensure_not_expanded show :deep/a &&
1418+
14041419
echo >>sparse-index/a &&
14051420
ensure_not_expanded stash &&
14061421
ensure_not_expanded stash list &&

0 commit comments

Comments
 (0)