diff options
author | Jerry Zhang <jerry@skydio.com> | 2021-12-18 00:29:02 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-12-20 21:39:45 +0100 |
commit | 34d607032c0db6a6c68754e7a339c3caf08d6a79 (patch) | |
tree | 0f24a284d6cfe1dbe5cf64e367e20baf76d9c1b4 /t/t4108-apply-threeway.sh | |
parent | Git 2.34.1 (diff) | |
download | git-34d607032c0db6a6c68754e7a339c3caf08d6a79.tar.xz git-34d607032c0db6a6c68754e7a339c3caf08d6a79.zip |
git-apply: skip threeway in add / rename cases
Certain invocations of "git apply --3way" will attempt threeway and
fail due to missing objects, even though git is able to fall back on
apply_fragments and apply the patch successfully with a return value
of 0. To fix, return early from try_threeway() in the following
cases:
- When the patch is a rename and no lines have changed. In this
case, "git diff" doesn't record the blob info, so 3way is neither
possible nor necessary.
- When the patch is an addition and there is no add/add conflict,
i.e. direct_to_threeway is false. In this case, threeway will
fail since the preimage is not in cache, but isn't necessary
anyway since there is no conflict.
This fixes a few unecessary error messages when applying these kinds
of patches with --3way.
It also fixes a reported issue where applying a concatenation of
several git produced patches will fail when those patches involve a
deletion followed by creation of the same file. Add a test for this
case too. (test provided by <i@zenithal.me>)
Signed-off-by: Jerry Zhang <jerry@skydio.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/t4108-apply-threeway.sh')
-rwxr-xr-x | t/t4108-apply-threeway.sh | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/t/t4108-apply-threeway.sh b/t/t4108-apply-threeway.sh index cc3aa3314a..c558282bc0 100755 --- a/t/t4108-apply-threeway.sh +++ b/t/t4108-apply-threeway.sh @@ -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 |