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

[PATCH 09/23] Teach Git to respect skip-worktree bit (writing part)

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Dec 14, 2009, 10:30 UTC
Message-ID
<1260786666-8405-10-git-send-email-pclouds@gmail.com>
In-Reply-To
<1260786666-8405-1-git-send-email-pclouds@gmail.com>

This part is mainly to remove CE_VALID shortcuts (and as a consequence, ce_uptodate() shortcuts as it may be turned on by CE_VALID) in writing code path if skip-worktree is used. Various tests are added to avoid future breakages.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t7012-skip-worktree-writing.sh |  139 ++++++++++++++++++++++++++++++++++++++
 unpack-trees.c                   |    4 +-
 2 files changed, 141 insertions(+), 2 deletions(-)
 create mode 100755 t/t7012-skip-worktree-writing.sh
diff --git a/t/t7012-skip-worktree-writing.sh b/t/t7012-skip-worktree-writing.sh
new file mode 100755
index 0000000..c75efe4
--- /dev/null
+++ b/t/t7012-skip-worktree-writing.sh
@@ -0,0 +1,139 @@
+#!/bin/sh
+#
+# Copyright (c) 2008 Nguyễn Thái Ngọc Duy
+#
+
+test_description='test worktree writing operations when skip-worktree is used'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	test_commit init &&
+	echo modified >> init.t &&
+	touch added &&
+	git add init.t added &&
+	git commit -m "modified and added" &&
+	git tag top
+'
+
+test_expect_success 'read-tree updates worktree, absent case' '
+	git checkout -f top &&
+	git update-index --skip-worktree init.t &&
+	rm init.t &&
+	git read-tree -m -u HEAD^ &&
+	echo init > expected &&
+	test_cmp expected init.t
+'
+
+test_expect_success 'read-tree updates worktree, dirty case' '
+	git checkout -f top &&
+	git update-index --skip-worktree init.t &&
+	echo dirty >> init.t &&
+	test_must_fail git read-tree -m -u HEAD^ &&
+	grep -q dirty init.t &&
+	test "$(git ls-files -t init.t)" = "S init.t" &&
+	git update-index --no-skip-worktree init.t
+'
+
+test_expect_success 'read-tree removes worktree, absent case' '
+	git checkout -f top &&
+	git update-index --skip-worktree added &&
+	rm added &&
+	git read-tree -m -u HEAD^ &&
+	test ! -f added
+'
+
+test_expect_success 'read-tree removes worktree, dirty case' '
+	git checkout -f top &&
+	git update-index --skip-worktree added &&
+	echo dirty >> added &&
+	test_must_fail git read-tree -m -u HEAD^ &&
+	grep -q dirty added &&
+	test "$(git ls-files -t added)" = "S added" &&
+	git update-index --no-skip-worktree added
+'
+
+NULL_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
+ZERO_SHA0=0000000000000000000000000000000000000000
+setup_absent() {
+	test -f 1 && rm 1
+	git update-index --remove 1 &&
+	git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
+	git update-index --skip-worktree 1
+}
+
+test_absent() {
+	echo "100644 $NULL_SHA1 0	1" > expected &&
+	git ls-files --stage 1 > result &&
+	test_cmp expected result &&
+	test ! -f 1
+}
+
+setup_dirty() {
+	git update-index --force-remove 1 &&
+	echo dirty > 1 &&
+	git update-index --add --cacheinfo 100644 $NULL_SHA1 1 &&
+	git update-index --skip-worktree 1
+}
+
+test_dirty() {
+	echo "100644 $NULL_SHA1 0	1" > expected &&
+	git ls-files --stage 1 > result &&
+	test_cmp expected result &&
+	echo dirty > expected
+	test_cmp expected 1
+}
+
+cat >expected <<EOF
+S 1
+H 2
+H init.t
+S sub/1
+H sub/2
+EOF
+
+test_expect_success 'index setup' '
+	git checkout -f init &&
+	mkdir sub &&
+	touch ./1 ./2 sub/1 sub/2 &&
+	git add 1 2 sub/1 sub/2 &&
+	git update-index --skip-worktree 1 sub/1 &&
+	git ls-files -t > result &&
+	test_cmp expected result
+'
+
+test_expect_success 'git-add ignores worktree content' '
+	setup_absent &&
+	git add 1 &&
+	test_absent
+'
+
+test_expect_success 'git-add ignores worktree content' '
+	setup_dirty &&
+	git add 1 &&
+	test_dirty
+'
+
+test_expect_success 'git-rm fails if worktree is dirty' '
+	setup_dirty &&
+	test_must_fail git rm 1 &&
+	test_dirty
+'
+
+cat >expected <<EOF
+Would remove expected
+Would remove result
+EOF
+test_expect_success 'git-clean, absent case' '
+	setup_absent &&
+	git clean -n > result &&
+	test_cmp expected result
+'
+
+test_expect_success 'git-clean, dirty case' '
+	setup_dirty &&
+	git clean -n > result &&
+	test_cmp expected result
+'
+
+test_done
diff --git a/unpack-trees.c b/unpack-trees.c
index 4870da9..1ab3c89 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -450,7 +450,7 @@ static int verify_uptodate(struct cache_entry *ce,
 {
 	struct stat st;
 
-	if (o->index_only || o->reset || ce_uptodate(ce))
+	if (o->index_only || (!ce_skip_worktree(ce) && (o->reset || ce_uptodate(ce))))
 		return 0;
 
 	if (!lstat(ce->name, &st)) {
@@ -1004,7 +1004,7 @@ int oneway_merge(struct cache_entry **src, struct unpack_trees_options *o)
 
 	if (old && same(old, a)) {
 		int update = 0;
-		if (o->reset && !ce_uptodate(old)) {
+		if (o->reset && !ce_uptodate(old) && !ce_skip_worktree(old)) {
 			struct stat st;
 			if (lstat(old->name, &st) ||
 			    ie_match_stat(o->src_index, old, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE))
-- 
1.6.5.2.216.g9c1ec
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 14 of 30 in “nd/sparse reroll”
  1. 00/23 nd/sparse rerollNguyễn Thái Ngọc Duy, Dec 14, 2009
  2. 01/23 update-index: refactor mark_valid() in preparation for new optionsNguyễn Thái Ngọc Duy, Dec 14, 2009
  3. 02/23 Add test-index-versionNguyễn Thái Ngọc Duy, Dec 14, 2009
  4. 03/23 Introduce "skip-worktree" bit in index, teach Git to get/set this bitNguyễn Thái Ngọc Duy, Dec 14, 2009
  5. Greg PriceDec 14, 2009
  6. Nguyen Thai Ngoc DuyDec 15, 2009
  7. Johannes SixtDec 15, 2009
  8. Nguyen Thai Ngoc DuyDec 15, 2009
  9. 04/23 update-index: ignore update request if it's skip-worktreeNguyễn Thái Ngọc Duy, Dec 14, 2009
  10. 05/23 Teach ls-files and update-index to respect skip-worktree bitNguyễn Thái Ngọc Duy, Dec 14, 2009
  11. 06/23 Teach diff machinery to respect skip-worktree bitNguyễn Thái Ngọc Duy, Dec 14, 2009
  12. 07/23 Teach grep to respect skip-worktree bitNguyễn Thái Ngọc Duy, Dec 14, 2009
  13. 08/23 Teach commit to respect skip-worktree bitNguyễn Thái Ngọc Duy, Dec 14, 2009
  14. 09/23 Teach Git to respect skip-worktree bit (writing part)Nguyễn Thái Ngọc Duy, Dec 14, 2009
  15. 10/23 Avoid writing to buffer in add_excludes_from_file_1()Nguyễn Thái Ngọc Duy, Dec 14, 2009
  16. 11/23 Read .gitignore from index if it is skip-worktreeNguyễn Thái Ngọc Duy, Dec 14, 2009
  17. 12/23 unpack-trees(): carry skip-worktree bit over in merged_entry()Nguyễn Thái Ngọc Duy, Dec 14, 2009
  18. 13/23 excluded_1(): support exclude files in indexNguyễn Thái Ngọc Duy, Dec 14, 2009
  19. 14/23 dir.c: export excluded_1() and add_excludes_from_file_1()Nguyễn Thái Ngọc Duy, Dec 14, 2009
  20. 15/23 Introduce "sparse checkout"Nguyễn Thái Ngọc Duy, Dec 14, 2009
  21. 16/23 unpack-trees(): add CE_WT_REMOVE to remove on worktree aloneNguyễn Thái Ngọc Duy, Dec 14, 2009
  22. 17/23 unpack-trees.c: generalize verify_* functionsNguyễn Thái Ngọc Duy, Dec 14, 2009
  23. 18/23 unpack-trees(): "enable" sparse checkout and load $GIT_DIR/info/sparse-checkoutNguyễn Thái Ngọc Duy, Dec 14, 2009
  24. 19/23 unpack_trees(): apply $GIT_DIR/info/sparse-checkout to the final indexNguyễn Thái Ngọc Duy, Dec 14, 2009
  25. 20/23 unpack-trees(): ignore worktree check outside checkout areaNguyễn Thái Ngọc Duy, Dec 14, 2009
  26. 21/23 read-tree: add --no-sparse-checkout to disable sparse checkout supportNguyễn Thái Ngọc Duy, Dec 14, 2009
  27. 22/23 Add tests for sparse checkoutNguyễn Thái Ngọc Duy, Dec 14, 2009
  28. 23/23 sparse checkout: inhibit empty worktreeNguyễn Thái Ngọc Duy, Dec 14, 2009
  29. Johannes SixtDec 14, 2009
  30. Nguyen Thai Ngoc DuyDec 14, 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.