copies: handle more cases where a file got replaced by a copy
authorMartin von Zweigbergk <martinvonz@google.com>
Mon, 22 Jun 2020 22:47:43 -0700
changeset 45817 58e7ee23ddbd
parent 45816 4b79e92a5ef8
child 45818 b7b8a1538161
copies: handle more cases where a file got replaced by a copy This patch fixes the changeset-centric version in a pretty straight-forward way. It fixes it to automatically resolve the conflict, which is better than resulting in a modify/delete conflict as it was before b4057d001760 (merge: when rename was made on both sides, use ancestor as merge base, 2020-01-22). I'll leave it for later to test and explicitly handle cases where files have been renamed to the same target on different sides of the merge. Differential Revision: https://phab.mercurial-scm.org/D8653
mercurial/merge.py
tests/test-copies.t
--- a/mercurial/merge.py	Mon Jun 22 22:47:33 2020 -0700
+++ b/mercurial/merge.py	Mon Jun 22 22:47:43 2020 -0700
@@ -817,6 +817,22 @@
                     args = (f, f, None, False, pa.node())
                     msg = b'both created'
                 mresult.addfile(f, mergestatemod.ACTION_MERGE, args, msg)
+            elif f in branch_copies1.copy:
+                fa = branch_copies1.copy[f]
+                mresult.addfile(
+                    f,
+                    mergestatemod.ACTION_MERGE,
+                    (f, fa, fa, False, pa.node()),
+                    b'local replaced from %s' % fa,
+                )
+            elif f in branch_copies2.copy:
+                fa = branch_copies2.copy[f]
+                mresult.addfile(
+                    f,
+                    mergestatemod.ACTION_MERGE,
+                    (fa, f, fa, False, pa.node()),
+                    b'other replaced from %s' % fa,
+                )
             else:
                 a = ma[f]
                 fla = ma.flags(f)
--- a/tests/test-copies.t	Mon Jun 22 22:47:33 2020 -0700
+++ b/tests/test-copies.t	Mon Jun 22 22:47:43 2020 -0700
@@ -496,16 +496,17 @@
   1 files updated, 0 files merged, 0 files removed, 1 files unresolved
   use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
   [1]
-BROKEN: should be "modified"
+This should ideally be "modified", but we will probably not be able to fix
+that in the filelog case.
   $ cat y
   original
 #else
   $ hg merge 2
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  merging x and y to y
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
-BROKEN: should be "modified"
   $ cat y
-  original
+  modified
 #endif
 Same as above, but in the opposite direction
 #if filelog
@@ -523,11 +524,11 @@
 #else
   $ hg co -qC 2
   $ hg merge 3
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  merging y and x to y
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
   (branch merge, don't forget to commit)
-BROKEN: should be "modified"
   $ cat y
-  original
+  modified
 #endif
 
 Create x and y, then rename x to z on one side of merge, and rename y to z and