Applying a patch that adds a file when that file is registered with "git
add -N" will fail with message "already exists in index" because
git-apply checks, sees those i-t-a entries and aborts. git-apply does
not realize those are for bookkeeping only, they do not really exist in
the index. This patch tightens the "exists in index" check, ignoring
i-t-a entries.
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 54aba4e..76b58a1 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -3553,10 +3553,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