diff --git a/cli/src/commands/split.rs b/cli/src/commands/split.rs index aa8e00924cf..8c6fab62070 100644 --- a/cli/src/commands/split.rs +++ b/cli/src/commands/split.rs @@ -175,18 +175,16 @@ the operation will be aborted. // second commit after the command finishes. This also means that any // branches pointing to the commit being split are moved to the second // commit. - tx.mut_repo() - .set_rewritten_commit(commit.id().clone(), second_commit.id().clone()); - let num_rebased = if args.siblings { - rebase_children_for_siblings_split( - &mut tx, - command.settings(), - &commit, - vec![first_commit.clone(), second_commit.clone()], - )? + if args.siblings { + tx.mut_repo().set_rewritten_commit_multiple( + commit.id().clone(), + vec![first_commit.id().clone(), second_commit.id().clone()], + ); } else { - tx.mut_repo().rebase_descendants(command.settings())? + tx.mut_repo() + .set_rewritten_commit(commit.id().clone(), second_commit.id().clone()); }; + let num_rebased = tx.mut_repo().rebase_descendants(command.settings())?; if let Some(mut formatter) = ui.status_formatter() { if num_rebased > 0 { @@ -201,34 +199,3 @@ the operation will be aborted. tx.finish(ui, format!("split commit {}", commit.id().hex()))?; Ok(()) } - -// Rebases the children of `original_commit` by replacing `original_commit` with -// `new_siblings`. Any parents other than `original_commit` will remain after -// the rebase. -fn rebase_children_for_siblings_split( - tx: &mut WorkspaceCommandTransaction, - settings: &UserSettings, - original_commit: &Commit, - new_siblings: Vec, -) -> Result { - let children: Vec = RevsetExpression::commit(original_commit.id().clone()) - .children() - .evaluate_programmatic(tx.base_repo().as_ref())? - .iter() - .commits(tx.base_repo().store()) - .try_collect()?; - let mut num_rebased = 0; - for child in children { - let mut new_parents = new_siblings.clone(); - new_parents.extend( - child - .parents() - .into_iter() - // Filter out the commit being split. - .filter(|c| c.id() != original_commit.id()), - ); - num_rebased += - rebase_descendants(tx, settings, &new_parents, &[child], Default::default())?; - } - Ok(num_rebased) -} diff --git a/cli/tests/test_split_command.rs b/cli/tests/test_split_command.rs index 49b615115c9..ee1f673b319 100644 --- a/cli/tests/test_split_command.rs +++ b/cli/tests/test_split_command.rs @@ -296,9 +296,9 @@ JJ: Lines starting with "JJ: " (like this one) will be removed. ); assert!(!test_env.env_root().join("editor2").exists()); insta::assert_snapshot!(get_log_output(&test_env, &workspace_path), @r###" - @ zsuskulnrvyr false test_branch - │ ◉ qpvuntsmwlqt false TESTED=TODO - ├─╯ + ◉ zsuskulnrvyr false test_branch?? + │ @ qpvuntsmwlqt false TESTED=TODO + ├─╯ test_branch?? ◉ zzzzzzzzzzzz true "###); } @@ -371,8 +371,8 @@ JJ: Lines starting with "JJ: " (like this one) will be removed. ◉ kkmpptxzrspx false Add file4 ◉ rlvkpnrzqnoo false Add file3 ├─╮ - │ @ yqosqzytrlsw false Add file2 - ◉ │ qpvuntsmwlqt false Add file1 + │ ◉ yqosqzytrlsw false Add file2 + @ │ qpvuntsmwlqt false Add file1 ├─╯ ◉ zzzzzzzzzzzz true "###); @@ -416,10 +416,10 @@ fn test_split_siblings_with_merge_child() { insta::assert_snapshot!(get_log_output(&test_env, &workspace_path), @r###" @ zsuskulnrvyr true 2 ├─┬─╮ - │ │ ◉ qpvuntsmwlqt true 1 - │ ◉ │ royxmykxtrkr false Add file2 + │ │ ◉ royxmykxtrkr false Add file2 + │ ◉ │ kkmpptxzrspx false Add file1 │ ├─╯ - ◉ │ kkmpptxzrspx false Add file1 + ◉ │ qpvuntsmwlqt true 1 ├─╯ ◉ zzzzzzzzzzzz true "###); diff --git a/lib/src/repo.rs b/lib/src/repo.rs index 422c3f42a5c..d3eb92108f7 100644 --- a/lib/src/repo.rs +++ b/lib/src/repo.rs @@ -831,6 +831,12 @@ impl MutableRepo { .insert(old_id, (RewriteType::Rewritten, vec![new_id])); } + pub fn set_rewritten_commit_multiple(&mut self, old_id: CommitId, new_ids: Vec) { + assert_ne!(old_id, *self.store().root_commit_id()); + self.parent_mapping + .insert(old_id, (RewriteType::Rewritten, new_ids)); + } + /// Record a commit as being rewritten into multiple other commits in this /// transaction. ///