]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jz/apply-3-corner-cases'
authorJunio C Hamano <gitster@pobox.com>
Mon, 10 Jan 2022 19:52:53 +0000 (11:52 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Jan 2022 19:52:53 +0000 (11:52 -0800)
"git apply --3way" bypasses the attempt to do a three-way
application in more cases to address the regression caused by the
recent change to use direct application as a fallback.

* jz/apply-3-corner-cases:
  git-apply: skip threeway in add / rename cases

apply.c
t/t4108-apply-threeway.sh

diff --git a/apply.c b/apply.c
index fed195250b64eea60e34849940c43016c2c3b5fa..afc1c6510e795491f62bb1c740bbd3b75b4200f4 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -3582,7 +3582,9 @@ static int try_threeway(struct apply_state *state,
 
        /* No point falling back to 3-way merge in these cases */
        if (patch->is_delete ||
-           S_ISGITLINK(patch->old_mode) || S_ISGITLINK(patch->new_mode))
+           S_ISGITLINK(patch->old_mode) || S_ISGITLINK(patch->new_mode) ||
+           (patch->is_new && !patch->direct_to_threeway) ||
+           (patch->is_rename && !patch->lines_added && !patch->lines_deleted))
                return -1;
 
        /* Preimage the patch was prepared for */
index cc3aa3314a3448cd1d5c845ce9803f0877db83ce..c558282bc0947548760b0e0cfce68f29f8dc2835 100755 (executable)
@@ -275,4 +275,22 @@ test_expect_success 'apply full-index patch with 3way' '
        git apply --3way --index bin.diff
 '
 
+test_expect_success 'apply delete then new patch with 3way' '
+       git reset --hard main &&
+       test_write_lines 2 > delnew &&
+       git add delnew &&
+       git diff --cached >> new.patch &&
+       git reset --hard &&
+       test_write_lines 1 > delnew &&
+       git add delnew &&
+       git commit -m "delnew" &&
+       rm delnew &&
+       git diff >> delete-then-new.patch &&
+       cat new.patch >> delete-then-new.patch &&
+
+       git checkout -- . &&
+       # Apply must succeed.
+       git apply --3way delete-then-new.patch
+'
+
 test_done