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

[PATCH 3/6] apply: fix adding new files on i-t-a entries

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Dec 27, 2015, 01:51 UTC
Message-ID
<1451181092-26054-4-git-send-email-pclouds@gmail.com>
In-Reply-To
<1451181092-26054-1-git-send-email-pclouds@gmail.com>

Suppose that you came up with some contents to register at path F in your working tree, told Git about your intention with "add -N F", and then tried to apply a patch that wants to _create_ F:

Without this patch, we would say "F already exists so a patch to create is incompatible with our current state".

With this patch, i-t-a entries are ignored and we do not say that, but instead we'll hopefully trigger "does it exist in the working tree" check, unless you are running under "--cached".

Which means that this change will not lead to data loss in the "untracked" file F in the working tree that was merely added to the index with i-t-a bit.

(commit message mostly from Junio)
Reported-by: Patrick Higgins <phiggins@google.com>
Reported-by: Bjørnar Snoksrud <snoksrud@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/apply.c       |  9 +++++----
 t/t2203-add-intent.sh | 13 +++++++++++++
 2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/builtin/apply.c b/builtin/apply.c
index 0769b09..315fce8 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -3550,10 +3550,11 @@ static int check_to_create(const char *new_name, int ok_if_exists)
 {
 	struct stat nst;
 
-	if (check_index &&
-	    cache_name_pos(new_name, strlen(new_name)) >= 0 &&
-	    !ok_if_exists)
-		return EXISTS_IN_INDEX;
+	if (check_index && !ok_if_exists) {
+		int pos = cache_name_pos(new_name, strlen(new_name));
+		if (pos >= 0 && !ce_intent_to_add(active_cache[pos]))
+			return EXISTS_IN_INDEX;
+	}
 	if (cached)
 		return 0;
 
diff --git a/t/t2203-add-intent.sh b/t/t2203-add-intent.sh
index 2a4a749..bb5ef2b 100755
--- a/t/t2203-add-intent.sh
+++ b/t/t2203-add-intent.sh
@@ -82,5 +82,18 @@ test_expect_success 'cache-tree invalidates i-t-a paths' '
 	test_cmp expect actual
 '
 
+test_expect_success 'apply adds new file on i-t-a entry' '
+	git init apply &&
+	(
+		cd apply &&
+		echo newcontent >newfile &&
+		git add newfile &&
+		git diff --cached >patch &&
+		rm .git/index &&
+		git add -N newfile &&
+		git apply --cached patch
+	)
+'
+
 test_done
 
-- 
2.3.0.rc1.137.g477eb31
Previous: Junio C HamanoNext: Junio C Hamano
Message 6 of 15 in “nd/ita-cleanup updates”
  1. 0/6 nd/ita-cleanup updatesNguyễn Thái Ngọc Duy, Dec 27, 2015
  2. 1/6 blame: remove obsolete commentNguyễn Thái Ngọc Duy, Dec 27, 2015
  3. Junio C HamanoDec 28, 2015
  4. 2/6 Add and use convenient macro ce_intent_to_add()Nguyễn Thái Ngọc Duy, Dec 27, 2015
  5. Junio C HamanoDec 28, 2015
  6. 3/6 apply: fix adding new files on i-t-a entriesNguyễn Thái Ngọc Duy, Dec 27, 2015
  7. Junio C HamanoDec 28, 2015
  8. Duy NguyenDec 29, 2015
  9. Junio C HamanoDec 29, 2015
  10. 4/6 apply: make sure check_preimage() does not leave empty file on errorNguyễn Thái Ngọc Duy, Dec 27, 2015
  11. Junio C HamanoDec 28, 2015
  12. 5/6 checkout(-index): do not checkout i-t-a entriesNguyễn Thái Ngọc Duy, Dec 27, 2015
  13. Junio C HamanoDec 28, 2015
  14. 6/6 grep: make it clear i-t-a entries are ignoredNguyễn Thái Ngọc Duy, Dec 27, 2015
  15. Junio C HamanoDec 28, 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.