mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-15 16:53:25 +00:00
merged_tree: build unresolved Merge<Tree> from interleaved list
We no longer need to iterate removes and adds separately.
This commit is contained in:
parent
dd26b7be40
commit
a734f46130
1 changed files with 8 additions and 16 deletions
|
@ -498,7 +498,7 @@ fn merge_trees(merge: &Merge<Tree>) -> Result<Merge<Tree>, TreeMergeError> {
|
||||||
new_tree.set_or_remove(basename, value);
|
new_tree.set_or_remove(basename, value);
|
||||||
}
|
}
|
||||||
Err(path_merge) => {
|
Err(path_merge) => {
|
||||||
conflicts.push((basename, path_merge));
|
conflicts.push((basename, path_merge.into_iter()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -509,24 +509,16 @@ fn merge_trees(merge: &Merge<Tree>) -> Result<Merge<Tree>, TreeMergeError> {
|
||||||
// For each side of the conflict, overwrite the entries in `new_tree` with the
|
// For each side of the conflict, overwrite the entries in `new_tree` with the
|
||||||
// values from `conflicts`. Entries that are not in `conflicts` will remain
|
// values from `conflicts`. Entries that are not in `conflicts` will remain
|
||||||
// unchanged and will be reused for each side.
|
// unchanged and will be reused for each side.
|
||||||
let mut tree_removes = vec![];
|
let tree_count = merge.iter().len();
|
||||||
for i in 0..merge.removes().len() {
|
let mut new_trees = Vec::with_capacity(tree_count);
|
||||||
for (basename, path_conflict) in &conflicts {
|
for _ in 0..tree_count {
|
||||||
new_tree.set_or_remove(basename, path_conflict.get_remove(i).unwrap().clone());
|
for (basename, path_conflict) in &mut conflicts {
|
||||||
|
new_tree.set_or_remove(basename, path_conflict.next().unwrap());
|
||||||
}
|
}
|
||||||
let tree = store.write_tree(dir, new_tree.clone())?;
|
let tree = store.write_tree(dir, new_tree.clone())?;
|
||||||
tree_removes.push(tree);
|
new_trees.push(tree);
|
||||||
}
|
}
|
||||||
let mut tree_adds = vec![];
|
Ok(Merge::from_vec(new_trees))
|
||||||
for i in 0..merge.adds().len() {
|
|
||||||
for (basename, path_conflict) in &conflicts {
|
|
||||||
new_tree.set_or_remove(basename, path_conflict.get_add(i).unwrap().clone());
|
|
||||||
}
|
|
||||||
let tree = store.write_tree(dir, new_tree.clone())?;
|
|
||||||
tree_adds.push(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Merge::new(tree_removes, tree_adds))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue