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

[PATCH] checkout.c: unstage empty deleted ita files

From
Varun Naik <vcnaik94@gmail.com>
Date
Jul 26, 2019, 04:56 UTC
Message-ID
<20190726045645.2437-1-vcnaik94@gmail.com>

It is possible to delete a committed file from the index and then add it as intent-to-add. After `git checkout HEAD` or `git restore --staged`, the file should be identical in the index and HEAD. This patch provides the desired behavior even when the file is empty in the index.

Signed-off-by: Varun Naik <vcnaik94@gmail.com>
---
CC Jeff because you wrote the code that I am changing now.

checkout.c:update_some() discards the newly created cache entry when its mode and oid match those of the old entry. Since an ita file has the same oid as an empty file, an empty deleted ita file passes both of these checks, and the new entry is discarded. In this case, the file should be added to the cache instead.

This change should not affect newly added ita files. For those, inside tree.c:read_tree_1(), tree_entry_interesting() returns entry_not_interesting, so fn (which points to update_some()) is never called.

To the best of my understanding, the only other command that makes changes to the index differently for nonempty vs empty deleted ita files is "reset", which I am fixing in [0]. I am separating the two changes because this change affects "restore", which has not reached maint yet.

[0]: https://public-inbox.org/git/20190726044806.2216-1-vcnaik94@gmail.com/
 builtin/checkout.c        |  1 +
 t/t2022-checkout-paths.sh | 11 +++++++++++
 t/t2070-restore.sh        | 11 +++++++++++
 3 files changed, 23 insertions(+)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 91f8509f85..27daa09c3c 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -126,6 +126,7 @@ static int update_some(const struct object_id *oid, struct strbuf *base,
 	if (pos >= 0) {
 		struct cache_entry *old = active_cache[pos];
 		if (ce->ce_mode == old->ce_mode &&
+		    !ce_intent_to_add(old) &&
 		    oideq(&ce->oid, &old->oid)) {
 			old->ce_flags |= CE_UPDATE;
 			discard_cache_entry(ce);
diff --git a/t/t2022-checkout-paths.sh b/t/t2022-checkout-paths.sh
index fc3eb43b89..74add853fd 100755
--- a/t/t2022-checkout-paths.sh
+++ b/t/t2022-checkout-paths.sh
@@ -78,4 +78,15 @@ test_expect_success 'do not touch files that are already up-to-date' '
 	test_cmp expect actual
 '
 
+test_expect_success 'checkout HEAD adds deleted intent-to-add file back to index' '
+	echo "nonempty" >nonempty &&
+	>empty &&
+	git add nonempty empty &&
+	git commit -m "create files to be deleted" &&
+	git rm --cached nonempty empty &&
+	git add -N nonempty empty &&
+	git checkout HEAD nonempty empty &&
+	git diff --staged --exit-code
+'
+
 test_done
diff --git a/t/t2070-restore.sh b/t/t2070-restore.sh
index 2650df1966..09b1543a5b 100755
--- a/t/t2070-restore.sh
+++ b/t/t2070-restore.sh
@@ -95,4 +95,15 @@ test_expect_success 'restore --ignore-unmerged ignores unmerged entries' '
 	)
 '
 
+test_expect_success 'restore --staged adds deleted intent-to-add file back to index' '
+	echo "nonempty" >nonempty &&
+	>empty &&
+	git add nonempty empty &&
+	git commit -m "create files to be deleted" &&
+	git rm --cached nonempty empty &&
+	git add -N nonempty empty &&
+	git restore --staged nonempty empty &&
+	git diff --staged --exit-code
+'
+
 test_done
-- 
2.22.0
Next: Varun Naik
Message 1 of 11 in “checkout.c: unstage empty deleted ita files”
  1. checkout.c: unstage empty deleted ita filesVarun Naik, Jul 26, 2019
  2. Varun NaikJul 26, 2019
  3. Jeff KingJul 26, 2019
  4. Varun NaikJul 29, 2019
  5. Jeff KingJul 29, 2019
  6. checkout.c: unstage empty deleted ita filesVarun Naik, Aug 1, 2019
  7. Junio C HamanoAug 1, 2019
  8. Jeff KingAug 1, 2019
  9. restore: add test for deleted ita filesVarun Naik, Aug 1, 2019
  10. Junio C HamanoAug 2, 2019
  11. checkout.c: unstage empty deleted ita filesVarun Naik, Aug 2, 2019

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.