Skip to content

Commit

Permalink
show: integrate with the sparse index
Browse files Browse the repository at this point in the history
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 <dstolee@microsoft.com>
  • Loading branch information
derrickstolee authored and ldennington committed Jan 20, 2022
1 parent c727bdd commit 18eeafb
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 1 deletion.
3 changes: 3 additions & 0 deletions builtin/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,9 @@ int cmd_show(int argc, const char **argv, const char *prefix)
init_log_defaults();
git_config(git_log_config, NULL);

prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;

memset(&match_all, 0, sizeof(match_all));
repo_init_revisions(the_repository, &rev, prefix);
rev.diff = 1;
Expand Down
17 changes: 16 additions & 1 deletion t/t1092-sparse-checkout-compatibility.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1177,7 +1177,19 @@ test_expect_success 'show (cached blobs/trees)' '
# when the directory is outside of the cone.
test_all_match test_must_fail git show :deep/ &&
test_must_fail git -C full-checkout show :folder1/ &&
test_sparse_match test_must_fail git show :folder1/
test_must_fail git -C sparse-checkout show :folder1/ &&
# The sparse index actually has "folder1" inside, so
# "git show :folder1/" succeeds when it did not before.
git -C sparse-index show :folder1/ >actual &&
git -C sparse-index show HEAD:folder1 >expect &&
# The output of "git show" includes the way we
# referenced the objects, so strip that out.
test_line_count = 4 actual &&
tail -n 2 actual >actual-trunc &&
tail -n 2 expect >expect-trunc &&
test_cmp expect-trunc actual-trunc
'

test_expect_success 'submodule handling' '
Expand Down Expand Up @@ -1294,6 +1306,9 @@ test_expect_success 'sparse-index is not expanded' '
echo >>sparse-index/untracked.txt &&
ensure_not_expanded add . &&
ensure_not_expanded show :a &&
ensure_not_expanded show :deep/a &&
echo >>sparse-index/a &&
ensure_not_expanded stash &&
ensure_not_expanded stash list &&
Expand Down

0 comments on commit 18eeafb

Please sign in to comment.