[Updated] [++- ] D8596: merge: mark copies in in-memory context when merging

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Thu Jun 11 14:34:33 UTC 2020


martinvonz updated this revision to Diff 21607.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D8596?vs=21603&id=21607

BRANCH
  default

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D8596/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D8596

AFFECTED FILES
  mercurial/merge.py
  mercurial/mergestate.py

CHANGE DETAILS

diff --git a/mercurial/mergestate.py b/mercurial/mergestate.py
--- a/mercurial/mergestate.py
+++ b/mercurial/mergestate.py
@@ -771,7 +771,6 @@
     for f, args, msg in actions.get(ACTION_PATH_CONFLICT_RESOLVE, []):
         (f0, origf0) = args
         repo.dirstate.add(f)
-        repo.dirstate.copy(origf0, f)
         if f0 == origf0:
             repo.dirstate.remove(f0)
         else:
@@ -814,10 +813,6 @@
             if f1 != f2:  # copy/rename
                 if move:
                     repo.dirstate.remove(f1)
-                if f1 != f:
-                    repo.dirstate.copy(f1, f)
-                else:
-                    repo.dirstate.copy(f2, f)
         else:
             # We've update-merged a locally modified file, so
             # we set the dirstate to emulate a normal checkout
@@ -835,16 +830,13 @@
         if branchmerge:
             repo.dirstate.add(f)
             repo.dirstate.remove(f0)
-            repo.dirstate.copy(f0, f)
         else:
             repo.dirstate.normal(f)
             repo.dirstate.drop(f0)
 
     # directory rename, get
     for f, args, msg in actions.get(ACTION_LOCAL_DIR_RENAME_GET, []):
-        f0, flag = args
         if branchmerge:
             repo.dirstate.add(f)
-            repo.dirstate.copy(f0, f)
         else:
             repo.dirstate.normal(f)
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -1166,6 +1166,45 @@
     }
 
 
+def _extract_copies(actions, branchmerge):
+    """extract a copy dict (dst->src) from a dict of merge actions"""
+    copies = {}
+    # resolve path conflicts
+    for f, args, msg in actions.get(
+        mergestatemod.ACTION_PATH_CONFLICT_RESOLVE, []
+    ):
+        (f0, origf0) = args
+        copies[f] = origf0
+
+    # merge
+    for f, args, msg in actions.get(mergestatemod.ACTION_MERGE, []):
+        f1, f2, fa, move, anc = args
+        if branchmerge:
+            if f1 != f2:  # copy/rename
+                if f1 != f:
+                    copies[f] = f1
+                else:
+                    copies[f] = f2
+
+    # directory rename, move local
+    for f, args, msg in actions.get(
+        mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL, []
+    ):
+        f0, flag = args
+        if branchmerge:
+            copies[f] = f0
+
+    # directory rename, get
+    for f, args, msg in actions.get(
+        mergestatemod.ACTION_LOCAL_DIR_RENAME_GET, []
+    ):
+        f0, flag = args
+        if branchmerge:
+            copies[f] = f0
+
+    return copies
+
+
 def applyupdates(
     repo, actions, wctx, mctx, overwrite, wantfiledata, labels=None
 ):
@@ -1848,6 +1887,12 @@
             )
 
         wantfiledata = updatedirstate and not branchmerge
+        copies = {}
+        # We don't want to record copies when doing `hg update -C` (which is
+        # what `overwrite` is about)
+        if not overwrite:
+            copies = _extract_copies(actions, branchmerge)
+
         stats, getfiledata = applyupdates(
             repo, actions, wc, p2, overwrite, wantfiledata, labels=labels
         )
@@ -1855,6 +1900,7 @@
         if updatedirstate:
             with repo.dirstate.parentchange():
                 repo.setparents(fp1, fp2)
+                wc = repo[None]
                 mergestatemod.recordupdates(
                     repo, actions, branchmerge, getfiledata
                 )
@@ -1864,6 +1910,9 @@
                 if not branchmerge:
                     repo.dirstate.setbranch(p2.branch())
 
+        for dst, src in copies.items():
+            wc[dst].markcopied(src)
+
     # If we're updating to a location, clean up any stale temporary includes
     # (ex: this happens during hg rebase --abort).
     if not branchmerge:



To: martinvonz, #hg-reviewers, marmoute
Cc: marmoute, durin42, mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mercurial-scm.org/pipermail/mercurial-patches/attachments/20200611/378e9c2d/attachment-0001.html>


More information about the Mercurial-patches mailing list