git-apply: skip threeway in add / rename cases
commit34d607032c0db6a6c68754e7a339c3caf08d6a79
authorJerry Zhang <jerry@skydio.com>
Fri, 17 Dec 2021 23:29:02 +0000 (17 15:29 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 20 Dec 2021 20:39:45 +0000 (20 12:39 -0800)
tree0f24a284d6cfe1dbe5cf64e367e20baf76d9c1b4
parente9d7761bb94f20acc98824275e317fa82436c25d
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>
apply.c
t/t4108-apply-threeway.sh