[PATCH 3/6] apply: fix adding new files on i-t-a entries
From: Nguyễn Thái Ngọc Duy <hidden>
Date: 2016-06-15 23:07:34
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> Reported-by: Bjørnar Snoksrud <redacted> Signed-off-by: Nguyễn Thái Ngọc Duy <redacted> --- 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