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

[PATCH 2/5] unpack-trees: only clear CE_UPDATE|CE_REMOVE when skip-worktree is always set

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Jul 31, 2010, 06:14 UTC
Message-ID
<1280556869-707-3-git-send-email-pclouds@gmail.com>
In-Reply-To
<1280556869-707-1-git-send-email-pclouds@gmail.com>

The purpose of this clearing is, as explained in comment, because verify_*() may set those bits before apply_sparse_checkout() is called. By that time, it's not clear whether an entry will stay in checkout area or out. After $GIT_DIR/info/sparse-checkout is applied, we know what entries will be in finally. It's time to clean unwanted bits.

That works perfectly when checkout area remains unchanged. When checkout area changes, apply_sparse_checkout() may set CE_UPDATE or CE_WT_REMOVE to widen/narrow checkout area. Doing the clearing after apply_sparse_checkout() may clear those widening/narrowing bits unexpectedly.

So, only do that on entries that are not affected by checkout area changes (i.e. skip-worktree bit does not change after apply_sparse_checkout).

This code does not actually fix anything though, just future-proof. The removed code and the narrow/widen code inside apply_sparse_checkout are currently independent (narrow code never sets CE_REMOVE, widen code sets CE_UPDATE, but ce_skip_worktree() would be false).

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 t/t1011-read-tree-sparse-checkout.sh |   12 ++++++++++++
 unpack-trees.c                       |   26 ++++++++++++--------------
 2 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh
index 9189de8..2876daf 100755
--- a/t/t1011-read-tree-sparse-checkout.sh
+++ b/t/t1011-read-tree-sparse-checkout.sh
@@ -155,4 +155,16 @@ test_expect_success 'read-tree adds to worktree, dirty case' '
 	grep -q dirty sub/added
 '
 
+test_expect_success 'index removal and worktree narrowing at the same time' '
+	>empty &&
+	echo init.t >.git/info/sparse-checkout &&
+	echo sub/added >>.git/info/sparse-checkout &&
+	git checkout -f top &&
+	echo init.t >.git/info/sparse-checkout &&
+	git checkout removed &&
+	git ls-files sub/added >result
+	test ! -f sub/added &&
+	test_cmp empty result
+'
+
 test_done
diff --git a/unpack-trees.c b/unpack-trees.c
index e8f03f5..6d0df99 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -156,13 +156,18 @@ static int apply_sparse_checkout(struct cache_entry *ce, struct unpack_trees_opt
 		ce->ce_flags &= ~CE_SKIP_WORKTREE;
 
 	/*
-	 * We only care about files getting into the checkout area
-	 * If merge strategies want to remove some, go ahead, this
-	 * flag will be removed eventually in unpack_trees() if it's
-	 * outside checkout area.
+	 * if (!was_skip_worktree && !ce_skip_worktree()) {
+	 *	This is perfectly normal. Move on;
+	 * }
 	 */
-	if (ce->ce_flags & CE_REMOVE)
-		return 0;
+
+	/*
+	 * Merge strategies may set CE_UPDATE|CE_REMOVE outside checkout
+	 * area as a result of ce_skip_worktree() shortcuts in
+	 * verify_absent() and verify_uptodate(). Clear them.
+	 */
+	if (was_skip_worktree && ce_skip_worktree(ce))
+		ce->ce_flags &= ~(CE_UPDATE | CE_REMOVE);
 
 	if (!was_skip_worktree && ce_skip_worktree(ce)) {
 		/*
@@ -796,14 +801,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
 				ret = -1;
 				goto done;
 			}
-			/*
-			 * Merge strategies may set CE_UPDATE|CE_REMOVE outside checkout
-			 * area as a result of ce_skip_worktree() shortcuts in
-			 * verify_absent() and verify_uptodate(). Clear them.
-			 */
-			if (ce_skip_worktree(ce))
-				ce->ce_flags &= ~(CE_UPDATE | CE_REMOVE);
-			else
+			if (!ce_skip_worktree(ce))
 				empty_worktree = 0;
 
 		}
-- 
1.7.1.rc1.69.g24c2f7
Previous: Junio C HamanoNext: Jonathan Nieder
Message 5 of 10 in “nd/fix-sparse-checkout v2”
  1. 0/5 nd/fix-sparse-checkout v2Nguyễn Thái Ngọc Duy, Jul 31, 2010
  2. 1/5 t1011 (sparse checkout): style nitpicksNguyễn Thái Ngọc Duy, Jul 31, 2010
  3. Junio C HamanoAug 2, 2010
  4. Junio C HamanoAug 2, 2010
  5. 2/5 unpack-trees: only clear CE_UPDATE|CE_REMOVE when skip-worktree is always setNguyễn Thái Ngọc Duy, Jul 31, 2010
  6. Jonathan NiederAug 8, 2010
  7. 3/5 unpack-trees: let read-tree -u remove index entries outside sparse areaNguyễn Thái Ngọc Duy, Jul 31, 2010
  8. 4/5 unpack-trees: do not check for conflict entries too earlyNguyễn Thái Ngọc Duy, Jul 31, 2010
  9. 5/5 unpack-trees: mark new entries skip-worktree appropriatelyNguyễn Thái Ngọc Duy, Jul 31, 2010
  10. Jonathan NiederAug 3, 2010

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.