# HG changeset patch # User Pierre-Yves David # Date 2020-10-04 23:49:04 # Node ID 2367937982ba4e49ea147302cb46269b6a60be77 # Parent 10bb0856bb9fb00affee93662dba5be02089c0a4 copies-rust: encapsulate internal sets on `changes` The goal is to eventually stop creating the underlying set. So we need to encapsulate the call first. Differential Revision: https://phab.mercurial-scm.org/D9306 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 @@ -49,6 +49,19 @@ enum Action<'a> { Copied(&'a HgPath, &'a HgPath), } +/// This express the possible "special" case we can get in a merge +/// +/// See mercurial/metadata.py for details on these values. +#[derive(PartialEq)] +enum MergeCase { + /// Merged: file had history on both side that needed to be merged + Merged, + /// Salvaged: file was candidate for deletion, but survived the merge + Salvaged, + /// Normal: Not one of the two cases above + Normal, +} + impl ChangedFiles { pub fn new( removed: HashSet, @@ -88,6 +101,17 @@ impl ChangedFiles { 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 +346,21 @@ fn merge_copies_dict