git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/4] show: integrate with the sparse index

From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Date
Apr 7, 2022, 16:37 UTC
Message-ID
<27ab853a9b4f0a50880c92dd8949d6fe9b7f00ba.1649349442.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1207.git.1649349442.gitgitgadget@gmail.com>
From: Derrick Stolee <dstolee@microsoft.com>

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).

For now, we demonstrate how the sparse index integration is extremely simple for files outside of the cone as well as directories within the cone. A later change will resolve this behavior around sparse directories.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
---
 builtin/log.c                            |  5 +++++
 t/t1092-sparse-checkout-compatibility.sh | 23 +++++++++++++++++++----
 2 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/builtin/log.c b/builtin/log.c
index c211d66d1d0..8e2e9912ab9 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -661,6 +661,11 @@ int cmd_show(int argc, const char **argv, const char *prefix)
 	init_log_defaults();
 	git_config(git_log_config, NULL);
 
+	if (the_repository->gitdir) {
+		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);
 	git_config(grep_config, &rev.grep_filter);
diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
index 74792b5ebbc..f6a14e08b81 100755
--- a/t/t1092-sparse-checkout-compatibility.sh
+++ b/t/t1092-sparse-checkout-compatibility.sh
@@ -1159,12 +1159,20 @@ test_expect_success 'show (cached blobs/trees)' '
 	test_sparse_match git show :folder1/a &&
 
 	# Asking "git show" for directories in the index
-	# does not work as implemented. The error message is
-	# different for a full checkout and a sparse checkout
-	# when the directory is outside of the cone.
+	# changes depending on the existence of a sparse index.
 	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/ &&
+
+	git -C sparse-index show :folder1/ >actual &&
+	git -C full-checkout 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' '
@@ -1388,6 +1396,13 @@ test_expect_success 'sparse index is not expanded: diff' '
 	ensure_not_expanded diff --cached
 '
 
+test_expect_success 'sparse index is not expanded: show' '
+	init_repos &&
+
+	ensure_not_expanded show :a &&
+	ensure_not_expanded show :deep/a
+'
+
 test_expect_success 'sparse index is not expanded: update-index' '
 	init_repos &&
 
-- 
gitgitgadget
Previous: Derrick StoleeNext: Josh Steadmon
Message 5 of 26 in “Sparse index integration with 'git show'”
  1. 0/4 Sparse index integration with 'git show'Derrick Stolee via GitGitGadget, Apr 7, 2022
  2. 1/4 t1092: add compatibility tests for 'git show'Derrick Stolee via GitGitGadget, Apr 7, 2022
  3. Josh SteadmonApr 14, 2022
  4. Derrick StoleeApr 18, 2022
  5. 2/4 show: integrate with the sparse indexDerrick Stolee via GitGitGadget, Apr 7, 2022
  6. Josh SteadmonApr 14, 2022
  7. Derrick StoleeApr 18, 2022
  8. 3/4 object-name: reject trees found in the indexDerrick Stolee via GitGitGadget, Apr 7, 2022
  9. Josh SteadmonApr 14, 2022
  10. Derrick StoleeApr 18, 2022
  11. 4/4 object-name: diagnose trees in index properlyDerrick Stolee via GitGitGadget, Apr 7, 2022
  12. Philip OakleyApr 7, 2022
  13. Junio C HamanoApr 12, 2022
  14. Derrick StoleeApr 12, 2022
  15. Junio C HamanoApr 12, 2022
  16. Josh SteadmonApr 14, 2022
  17. Junio C HamanoApr 14, 2022
  18. Derrick StoleeApr 18, 2022
  19. 0/5 Sparse index integration with 'git show'Derrick Stolee via GitGitGadget, Apr 26, 2022
  20. 1/5 t1092: add compatibility tests for 'git show'Derrick Stolee via GitGitGadget, Apr 26, 2022
  21. 2/5 show: integrate with the sparse indexDerrick Stolee via GitGitGadget, Apr 26, 2022
  22. 3/5 object-name: reject trees found in the indexDerrick Stolee via GitGitGadget, Apr 26, 2022
  23. 4/5 object-name: diagnose trees in index properlyDerrick Stolee via GitGitGadget, Apr 26, 2022
  24. 5/5 rev-parse: integrate with sparse indexDerrick Stolee via GitGitGadget, Apr 26, 2022
  25. Junio C HamanoApr 26, 2022
  26. Derrick StoleeApr 27, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.