Patchwork D9590: copies: extract value comparison in the python copy tracing

login
register
mail settings
Submitter phabricator
Date Dec. 14, 2020, 11:18 a.m.
Message ID <differential-rev-PHID-DREV-hvo2mvlx7gi7gxl4f7ui-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47888/
State Superseded
Headers show

Comments

phabricator - Dec. 14, 2020, 11:18 a.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  This mirror what we did in the Python code. This is useful to prepare rework for
  this comparison logic that we will need to handle more advanced chaining cases
  (when merges are chained).

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  mercurial/copies.py

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -447,6 +447,12 @@ 
     return final_copies
 
 
+# constant to decide which side to pick with _merge_copies_dict
+PICK_MINOR = 0
+PICK_MAJOR = 1
+PICK_EITHER = 2
+
+
 def _merge_copies_dict(minor, major, isancestor, changes):
     """merge two copies-mapping together, minor and major
 
@@ -465,36 +471,37 @@ 
         if other is None:
             minor[dest] = value
         else:
-            new_tt = value[0]
-            other_tt = other[0]
-            if value[1] == other[1]:
-                continue
-            # content from "major" wins, unless it is older
-            # than the branch point or there is a merge
-            if new_tt == other_tt:
+            pick = _compare_values(changes, isancestor, dest, other, value)
+            if pick == PICK_MAJOR:
                 minor[dest] = value
-            elif (
-                changes is not None
-                and value[1] is None
-                and dest in changes.salvaged
-            ):
-                pass
-            elif (
-                changes is not None
-                and other[1] is None
-                and dest in changes.salvaged
-            ):
-                minor[dest] = value
-            elif changes is not None and dest in changes.merged:
-                minor[dest] = value
-            elif not isancestor(new_tt, other_tt):
-                if value[1] is not None:
-                    minor[dest] = value
-                elif isancestor(other_tt, new_tt):
-                    minor[dest] = value
     return minor
 
 
+def _compare_values(changes, isancestor, dest, other, value):
+    """compare two value within a _merge_copies_dict loop iteration"""
+    new_tt = value[0]
+    other_tt = other[0]
+
+    if value[1] == other[1]:
+        return PICK_EITHER
+    # content from "major" wins, unless it is older
+    # than the branch point or there is a merge
+    if new_tt == other_tt:
+        return PICK_MAJOR
+    elif changes is not None and value[1] is None and dest in changes.salvaged:
+        return PICK_MINOR
+    elif changes is not None and other[1] is None and dest in changes.salvaged:
+        return PICK_MAJOR
+    elif changes is not None and dest in changes.merged:
+        return PICK_MAJOR
+    elif not isancestor(new_tt, other_tt):
+        if value[1] is not None:
+            return PICK_MAJOR
+        elif isancestor(other_tt, new_tt):
+            return PICK_MAJOR
+    return PICK_MINOR
+
+
 def _revinfo_getter_extra(repo):
     """return a function that return multiple data given a <rev>"i