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

[PATCH v2] unpack-trees: don't update files with CE_WT_REMOVE set

From
David Turner <dturner@twopensource.com>
Date
Jul 17, 2015, 21:19 UTC
Message-ID
<1437167967-5933-1-git-send-email-dturner@twopensource.com>
In-Reply-To
<xmqqk2ty1reo.fsf@gitster.dls.corp.google.com>

Don't update files in the worktree from cache entries which are flagged with CE_WT_REMOVE.

When a user does a sparse checkout, git removes files that are marked with CE_WT_REMOVE (because they are out-of-scope for the sparse checkout). If those files are also marked CE_UPDATE (for instance, because they differ in the branch that is being checked out and the outgoing branch), git would previously recreate them. This patch prevents them from being recreated.

These erroneously-created files would also interfere with merges, causing pre-merge revisions of out-of-scope files to appear in the worktree.

Signed-off-by: Anatole Shaw <git-devel@omni.poc.net>
Signed-off-by: David Turner <dturner@twopensource.com>
---
 t/t1090-sparse-checkout-scope.sh | 52 ++++++++++++++++++++++++++++++++++++++++
 unpack-trees.c                   |  2 +-
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100755 t/t1090-sparse-checkout-scope.sh
diff --git a/t/t1090-sparse-checkout-scope.sh b/t/t1090-sparse-checkout-scope.sh
new file mode 100755
index 0000000..1f61eb3
--- /dev/null
+++ b/t/t1090-sparse-checkout-scope.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+test_description='sparse checkout scope tests'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	echo "initial" >a &&
+	echo "initial" >b &&
+	echo "initial" >c &&
+	git add a b c &&
+	git commit -m "initial commit"
+'
+
+test_expect_success 'create feature branch' '
+	git checkout -b feature &&
+	echo "modified" >b &&
+	echo "modified" >c &&
+	git add b c &&
+	git commit -m "modification"
+'
+
+test_expect_success 'perform sparse checkout of master' '
+	git config --local --bool core.sparsecheckout true &&
+	echo "!/*" >.git/info/sparse-checkout &&
+	echo "/a" >>.git/info/sparse-checkout &&
+	echo "/c" >>.git/info/sparse-checkout &&
+	git checkout master &&
+	test_path_is_file a &&
+	test_path_is_missing b &&
+	test_path_is_file c
+'
+
+test_expect_success 'merge feature branch into sparse checkout of master' '
+	git merge feature &&
+	test_path_is_file a &&
+	test_path_is_missing b &&
+	test_path_is_file c &&
+	test "$(cat c)" = "modified"
+'
+
+test_expect_success 'return to full checkout of master' '
+	git checkout feature &&
+	echo "/*" >.git/info/sparse-checkout &&
+	git checkout master &&
+	test_path_is_file a &&
+	test_path_is_file b &&
+	test_path_is_file c &&
+	test "$(cat b)" = "modified"
+'
+
+test_done
diff --git a/unpack-trees.c b/unpack-trees.c
index 2927660..11a5300 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -223,7 +223,7 @@ static int check_updates(struct unpack_trees_options *o)
 	for (i = 0; i < index->cache_nr; i++) {
 		struct cache_entry *ce = index->cache[i];
 
-		if (ce->ce_flags & CE_UPDATE) {
+		if (ce->ce_flags & CE_UPDATE && !(ce->ce_flags & CE_WT_REMOVE)) {
 			display_progress(progress, ++cnt);
 			ce->ce_flags &= ~CE_UPDATE;
 			if (o->update && !o->dry_run) {
-- 
2.0.4.315.gad8727a-twtrsrc
Previous: Junio C HamanoNext: Junio C Hamano
Message 3 of 8 in “unpack-trees: don't update files flagged for deletion”
  1. unpack-trees: don't update files flagged for deletionDavid Turner, Jul 17, 2015
  2. Junio C HamanoJul 17, 2015
  3. unpack-trees: don't update files with CE_WT_REMOVE setDavid Turner, Jul 17, 2015
  4. Junio C HamanoJul 17, 2015
  5. Duy NguyenJul 18, 2015
  6. Junio C HamanoJul 18, 2015
  7. Junio C HamanoJul 21, 2015
  8. David TurnerJul 20, 2015

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.