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 <phigg...@google.com>
Reported-by: Bjørnar Snoksrud <snoks...@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@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 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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to