[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