copies-rust: make the comparison aware of the revision being current merged
authorPierre-Yves David <pierre-yves.david@octobus.net>
Wed, 02 Dec 2020 15:24:10 +0100
changeset 46156 7d99614b7b77
parent 46155 fce2f20a54ce
child 46157 021925827c60
copies-rust: make the comparison aware of the revision being current merged This make no significant performance change in practice (all ±2%) in practice, but it will help us to distinct between some semantically different cases later on. Differential Revision: https://phab.mercurial-scm.org/D9498
rust/hg-core/src/copy_tracing.rs
--- a/rust/hg-core/src/copy_tracing.rs	Sat Nov 21 17:00:32 2020 +0100
+++ b/rust/hg-core/src/copy_tracing.rs	Wed Dec 02 15:24:10 2020 +0100
@@ -431,6 +431,7 @@
                     // them.
                     Some(copies) => Some(merge_copies_dict(
                         &path_map,
+                        rev,
                         vertex_copies,
                         copies,
                         &changes,
@@ -558,6 +559,7 @@
 /// cases. See inline documentation for details.
 fn merge_copies_dict<A: Fn(Revision, Revision) -> bool>(
     path_map: &TwoWayPathMap,
+    current_merge: Revision,
     mut minor: TimeStampedPathCopies,
     mut major: TimeStampedPathCopies,
     changes: &ChangedFiles,
@@ -571,7 +573,13 @@
          src_minor: &TimeStampedPathCopy,
          src_major: &TimeStampedPathCopy| {
             compare_value(
-                path_map, changes, oracle, dest, src_minor, src_major,
+                path_map,
+                current_merge,
+                changes,
+                oracle,
+                dest,
+                src_minor,
+                src_major,
             )
         };
     if minor.is_empty() {
@@ -703,13 +711,33 @@
 #[allow(clippy::if_same_then_else)]
 fn compare_value<A: Fn(Revision, Revision) -> bool>(
     path_map: &TwoWayPathMap,
+    current_merge: Revision,
     changes: &ChangedFiles,
     oracle: &mut AncestorOracle<A>,
     dest: &PathToken,
     src_minor: &TimeStampedPathCopy,
     src_major: &TimeStampedPathCopy,
 ) -> MergePick {
-    if src_major.path == src_minor.path {
+    if src_major.rev == current_merge {
+        if src_minor.rev == current_merge {
+            if src_major.path.is_none() {
+                // We cannot get different copy information for both p1 and p2
+                // from the same revision. Unless this was a
+                // deletion
+                MergePick::Any
+            } else {
+                unreachable!();
+            }
+        } else {
+            // The last value comes the current merge, this value -will- win
+            // eventually.
+            MergePick::Major
+        }
+    } else if src_minor.rev == current_merge {
+        // The last value comes the current merge, this value -will- win
+        // eventually.
+        MergePick::Minor
+    } else if src_major.path == src_minor.path {
         // we have the same value, but from other source;
         if src_major.rev == src_minor.rev {
             // If the two entry are identical, they are both valid