mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-12 23:23:20 +00:00
rewrite: make CommitRewriter::replace_parents()
remove repeats
This commit is contained in:
parent
96f5ca47d4
commit
87c65ee0f9
2 changed files with 46 additions and 1 deletions
|
@ -146,11 +146,13 @@ impl<'repo> CommitRewriter<'repo> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update the intended new parents by replacing any occurrence of
|
/// Update the intended new parents by replacing any occurrence of
|
||||||
/// `old_parent` by `new_parents`
|
/// `old_parent` by `new_parents`.
|
||||||
pub fn replace_parent(&mut self, old_parent: &CommitId, new_parents: &[CommitId]) {
|
pub fn replace_parent(&mut self, old_parent: &CommitId, new_parents: &[CommitId]) {
|
||||||
if let Some(i) = self.new_parents.iter().position(|p| p == old_parent) {
|
if let Some(i) = self.new_parents.iter().position(|p| p == old_parent) {
|
||||||
self.new_parents
|
self.new_parents
|
||||||
.splice(i..i + 1, new_parents.iter().cloned());
|
.splice(i..i + 1, new_parents.iter().cloned());
|
||||||
|
let mut unique = HashSet::new();
|
||||||
|
self.new_parents.retain(|p| unique.insert(p.clone()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,3 +82,46 @@ fn test_transform_descendants_sync() {
|
||||||
assert_eq!(new_commit_e.parent_ids(), vec![new_commit_d.id().clone()]);
|
assert_eq!(new_commit_e.parent_ids(), vec![new_commit_d.id().clone()]);
|
||||||
assert_eq!(new_commit_f.parent_ids(), vec![new_commit_b.id().clone()]);
|
assert_eq!(new_commit_f.parent_ids(), vec![new_commit_b.id().clone()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Transform just commit C replacing parent A by parent B. The parents should be
|
||||||
|
// deduplicated.
|
||||||
|
//
|
||||||
|
// C
|
||||||
|
// /|
|
||||||
|
// B |
|
||||||
|
// |/
|
||||||
|
// A
|
||||||
|
#[test]
|
||||||
|
fn test_transform_descendants_sync_linearize_merge() {
|
||||||
|
let settings = testutils::user_settings();
|
||||||
|
let test_repo = TestRepo::init();
|
||||||
|
let repo = &test_repo.repo;
|
||||||
|
|
||||||
|
let mut tx = repo.start_transaction(&settings);
|
||||||
|
let mut graph_builder = CommitGraphBuilder::new(&settings, tx.mut_repo());
|
||||||
|
let commit_a = graph_builder.initial_commit();
|
||||||
|
let commit_b = graph_builder.commit_with_parents(&[&commit_a]);
|
||||||
|
let commit_c = graph_builder.commit_with_parents(&[&commit_a, &commit_b]);
|
||||||
|
|
||||||
|
let mut rebased = HashMap::new();
|
||||||
|
tx.mut_repo()
|
||||||
|
.transform_descendants(&settings, vec![commit_c.id().clone()], |mut rewriter| {
|
||||||
|
rewriter.replace_parent(commit_a.id(), &[commit_b.id().clone()]);
|
||||||
|
let old_commit_id = rewriter.old_commit().id().clone();
|
||||||
|
let new_commit = rewriter.rebase(&settings)?.write()?;
|
||||||
|
rebased.insert(old_commit_id, new_commit);
|
||||||
|
Ok(())
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(rebased.len(), 1);
|
||||||
|
let new_commit_c = rebased.get(commit_c.id()).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
*tx.mut_repo().view().heads(),
|
||||||
|
hashset! {
|
||||||
|
new_commit_c.id().clone(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(new_commit_c.parent_ids(), vec![commit_b.id().clone()]);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue