Skip to content
Snippets Groups Projects
Commit c0d70d761684 authored by Pierre-Yves David's avatar Pierre-Yves David :octopus:
Browse files

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.
parent e6228d07dc07
No related branches found
No related tags found
No related merge requests found
......@@ -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,4 +347,5 @@
// same rev. So this is the same value.
unreachable!();
} else {
let action = changes.get_merge_case(&dest);
if src_major.path.is_none()
......@@ -325,7 +351,7 @@
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()
......@@ -327,11 +353,11 @@
{
// 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();
......@@ -333,9 +359,9 @@
{
// 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.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment