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

[RFC PATCH v4 19/19] sparse checkout: inhibit empty worktree

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Aug 20, 2009, 13:47 UTC
Message-ID
<1250776033-12395-20-git-send-email-pclouds@gmail.com>
In-Reply-To
<1250776033-12395-19-git-send-email-pclouds@gmail.com>

The way sparse checkout works, users may empty their worktree completely, because of non-matching sparse-checkout spec, or empty spec. I believe this is not desired. This patch makes Git refuse to produce such worktree.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 t/t1009-read-tree-sparse-checkout.sh |   10 +++-------
 unpack-trees.c                       |    7 +++++++
 2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/t/t1009-read-tree-sparse-checkout.sh b/t/t1009-read-tree-sparse-checkout.sh
index 2192f5a..62246db 100755
--- a/t/t1009-read-tree-sparse-checkout.sh
+++ b/t/t1009-read-tree-sparse-checkout.sh
@@ -55,20 +55,16 @@ test_expect_success 'read-tree --no-sparse-checkout with empty .git/info/sparse-
 	test -f sub/added
 '
 
-cat >expected.swt <<EOF
-S init.t
-S sub/added
-EOF
 test_expect_success 'read-tree with empty .git/info/sparse-checkout' '
 	git config core.sparsecheckout true &&
 	echo > .git/info/sparse-checkout &&
-	git read-tree -m -u HEAD &&
+	test_must_fail git read-tree -m -u HEAD &&
 	git ls-files --stage > result &&
 	test_cmp expected result &&
 	git ls-files -t > result &&
 	test_cmp expected.swt result &&
-	test ! -f init.t &&
-	test ! -f sub/added
+	test -f init.t &&
+	test -f sub/added
 '
 
 cat >expected.swt <<EOF
diff --git a/unpack-trees.c b/unpack-trees.c
index 72743b3..80ae2a0 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -498,6 +498,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 	}
 
 	if (!o->skip_sparse_checkout) {
+		int empty_worktree = 1;
 		for (i = 0;i < o->result.cache_nr;i++) {
 			struct cache_entry *ce = o->result.cache[i];
 
@@ -512,8 +513,14 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 			 */
 			if (ce_skip_worktree(ce))
 				ce->ce_flags &= ~(CE_UPDATE | CE_REMOVE);
+			else
+				empty_worktree = 0;
 
 		}
+		if (o->result.cache_nr && empty_worktree) {
+			ret = unpack_failed(o, "Sparse checkout leaves no entry on working directory");
+			goto done;
+		}
 	}
 
 	o->src_index = NULL;
-- 
1.6.3.GIT
Previous: Nguyễn Thái Ngọc DuyNext: Nguyen Thai Ngoc Duy
Message 20 of 27 in “Sparse checkout”
  1. 00/19 Sparse checkoutNguyễn Thái Ngọc Duy, Aug 20, 2009
  2. 01/19 update-index: refactor mark_valid() in preparation for new optionsNguyễn Thái Ngọc Duy, Aug 20, 2009
  3. 02/19 Add test-index-versionNguyễn Thái Ngọc Duy, Aug 20, 2009
  4. 03/19 Introduce "skip-worktree" bit in index, teach Git to get/set this bitNguyễn Thái Ngọc Duy, Aug 20, 2009
  5. 04/19 Teach Git to respect skip-worktree bit (reading part)Nguyễn Thái Ngọc Duy, Aug 20, 2009
  6. 05/19 Teach Git to respect skip-worktree bit (writing part)Nguyễn Thái Ngọc Duy, Aug 20, 2009
  7. 06/19 Avoid writing to buffer in add_excludes_from_file_1()Nguyễn Thái Ngọc Duy, Aug 20, 2009
  8. 07/19 Read .gitignore from index if it is skip-worktreeNguyễn Thái Ngọc Duy, Aug 20, 2009
  9. 08/19 unpack-trees(): carry skip-worktree bit over in merged_entry()Nguyễn Thái Ngọc Duy, Aug 20, 2009
  10. 09/19 excluded_1(): support exclude files in indexNguyễn Thái Ngọc Duy, Aug 20, 2009
  11. 10/19 dir.c: export excluded_1() and add_excludes_from_file_1()Nguyễn Thái Ngọc Duy, Aug 20, 2009
  12. 11/19 Introduce "sparse checkout"Nguyễn Thái Ngọc Duy, Aug 20, 2009
  13. 12/19 unpack-trees(): add CE_WT_REMOVE to remove on worktree aloneNguyễn Thái Ngọc Duy, Aug 20, 2009
  14. 13/19 unpack-trees.c: generalize verify_* functionsNguyễn Thái Ngọc Duy, Aug 20, 2009
  15. 14/19 unpack-trees(): "enable" sparse checkout and load $GIT_DIR/info/sparse-checkoutNguyễn Thái Ngọc Duy, Aug 20, 2009
  16. 15/19 unpack_trees(): apply $GIT_DIR/info/sparse-checkout to the final indexNguyễn Thái Ngọc Duy, Aug 20, 2009
  17. 16/19 unpack-trees(): ignore worktree check outside checkout areaNguyễn Thái Ngọc Duy, Aug 20, 2009
  18. 17/19 read-tree: add --no-sparse-checkout to disable sparse checkout supportNguyễn Thái Ngọc Duy, Aug 20, 2009
  19. 18/19 Add tests for sparse checkoutNguyễn Thái Ngọc Duy, Aug 20, 2009
  20. 19/19 sparse checkout: inhibit empty worktreeNguyễn Thái Ngọc Duy, Aug 20, 2009
  21. Nguyen Thai Ngoc DuyAug 21, 2009
  22. Junio C HamanoAug 21, 2009
  23. Nguyen Thai Ngoc DuyAug 22, 2009
  24. Jakub NarebskiAug 20, 2009
  25. Matthieu MoyAug 20, 2009
  26. Junio C HamanoAug 21, 2009
  27. Nguyen Thai Ngoc DuyAug 21, 2009

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.