D9306: copies-rust: encapsulate internal sets on `changes`
marmoute (Pierre-Yves David)
phabricator at mercurial-scm.org
Thu Nov 12 15:17:08 UTC 2020
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
The goal is to eventually stop creating the underlying set. So we need to
encapsulate the call first.
REPOSITORY
rHG Mercurial
BRANCH
default
REVISION DETAIL
https://phab.mercurial-scm.org/D9306
AFFECTED FILES
rust/hg-core/src/copy_tracing.rs
CHANGE DETAILS
diff --git a/rust/hg-core/src/copy_tracing.rs b/rust/hg-core/src/copy_tracing.rs
--- a/rust/hg-core/src/copy_tracing.rs
+++ b/rust/hg-core/src/copy_tracing.rs
@@ -47,6 +47,20 @@
Copied(&'a HgPath, &'a HgPath),
}
+/// This express the possible "special" case we can get in a merge
+///
+/// Merged: file had history on both side that needed to be merged
+/// Salvaged: file was candidate for deletion, but survived the merge
+/// Normal: Not one of the two case above
+///
+/// The mercurial/metadata.py for details on these values.
+#[derive(PartialEq)]
+enum MergeCase {
+ Merged,
+ Salvaged,
+ Normal,
+}
+
impl ChangedFiles {
pub fn new(
removed: HashSet<HgPathBuf>,
@@ -86,6 +100,17 @@
let remove_iter = remove_iter.map(|x| Action::Removed(x));
copies_iter.chain(remove_iter)
}
+
+ /// return the MergeCase value associated with a filename
+ fn get_merge_case(&self, path: &HgPath) -> MergeCase {
+ if self.salvaged.contains(path) {
+ return MergeCase::Salvaged;
+ } else if self.merged.contains(path) {
+ return MergeCase::Merged;
+ } else {
+ return MergeCase::Normal;
+ }
+ }
}
/// A struct responsible for answering "is X ancestors of Y" quickly
@@ -322,20 +347,21 @@
// same rev. So this is the same value.
unreachable!();
} else {
+ let action = changes.get_merge_case(&dest);
if src_major.path.is_none()
- && changes.salvaged.contains(dest)
+ && action == MergeCase::Salvaged
{
// If the file is "deleted" in the major side but was
// salvaged by the merge, we keep the minor side alive
pick_minor();
} else if src_minor.path.is_none()
- && changes.salvaged.contains(dest)
+ && action == MergeCase::Salvaged
{
// If the file is "deleted" in the minor side but was
// salvaged by the merge, unconditionnaly preserve the
// major side.
pick_major();
- } else if changes.merged.contains(dest) {
+ } else if action == MergeCase::Merged {
// If the file was actively merged, copy information
// from each side might conflict. The major side will
// win such conflict.
To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
More information about the Mercurial-devel
mailing list