Mercurial > hg
changeset 46156:7d99614b7b77
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
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 02 Dec 2020 15:24:10 +0100 |
parents | fce2f20a54ce |
children | 021925827c60 |
files | rust/hg-core/src/copy_tracing.rs |
diffstat | 1 files changed, 30 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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