merge: use recursive merge when there are multiple common ancestors

This commit is contained in:
Martin von Zweigbergk 2021-05-15 10:56:15 -07:00
parent afe754a4e0
commit 6d61475f66

View file

@ -31,11 +31,13 @@ pub fn merge_commit_trees(repo: RepoRef, commits: &[Commit]) -> Tree {
let mut new_tree = commits[0].tree();
let commit_ids: Vec<_> = commits.iter().map(|commit| commit.id().clone()).collect();
for (i, other_commit) in commits.iter().enumerate().skip(1) {
let ancestors = index.common_ancestors(&commit_ids[0..i], &[commit_ids[i].clone()]);
// TODO: Do recursive merge here instead of using just the first ancestor.
let ancestor = store.get_commit(&ancestors[0]).unwrap();
let new_tree_id =
merge_trees(&new_tree, &ancestor.tree(), &other_commit.tree()).unwrap();
let ancestor_ids = index.common_ancestors(&commit_ids[0..i], &[commit_ids[i].clone()]);
let ancestors: Vec<_> = ancestor_ids
.iter()
.map(|id| store.get_commit(id).unwrap())
.collect();
let ancestor_tree = merge_commit_trees(repo, &ancestors);
let new_tree_id = merge_trees(&new_tree, &ancestor_tree, &other_commit.tree()).unwrap();
new_tree = store.get_tree(&DirRepoPath::root(), &new_tree_id).unwrap();
}
new_tree