ok/jj
1
0
Fork 0
forked from mirrors/jj

Rewrite rebasing in jj split using transform_descendants()

This is following on the rewrite for `parallelize`.

- https://github.com/martinvonz/jj/pull/3521

Since rebase_descendants from rebase.rs is no longer used outside of that file,
it can be made private again.
This commit is contained in:
Evan Mesterhazy 2024-04-20 10:48:52 -04:00 committed by Evan Mesterhazy
parent 6d2884317a
commit e0c53bcfc0
3 changed files with 22 additions and 52 deletions

View file

@ -286,7 +286,7 @@ fn rebase_branch(
} }
/// Rebases `old_commits` onto `new_parents`. /// Rebases `old_commits` onto `new_parents`.
pub fn rebase_descendants( fn rebase_descendants(
tx: &mut WorkspaceCommandTransaction, tx: &mut WorkspaceCommandTransaction,
settings: &UserSettings, settings: &UserSettings,
new_parents: Vec<Commit>, new_parents: Vec<Commit>,

View file

@ -13,18 +13,13 @@
// limitations under the License. // limitations under the License.
use std::io::Write; use std::io::Write;
use itertools::Itertools;
use jj_lib::commit::Commit;
use jj_lib::object_id::ObjectId; use jj_lib::object_id::ObjectId;
use jj_lib::repo::Repo; use jj_lib::repo::Repo;
use jj_lib::revset::{RevsetExpression, RevsetIteratorExt};
use jj_lib::rewrite::merge_commit_trees; use jj_lib::rewrite::merge_commit_trees;
use jj_lib::settings::UserSettings;
use tracing::instrument; use tracing::instrument;
use crate::cli_util::{CommandHelper, RevisionArg, WorkspaceCommandTransaction}; use crate::cli_util::{CommandHelper, RevisionArg};
use crate::command_error::CommandError; use crate::command_error::CommandError;
use crate::commands::rebase::rebase_descendants;
use crate::description_util::{description_template_for_commit, edit_description}; use crate::description_util::{description_template_for_commit, edit_description};
use crate::ui::Ui; use crate::ui::Ui;
@ -179,16 +174,24 @@ the operation will be aborted.
// commit. // commit.
tx.mut_repo() tx.mut_repo()
.set_rewritten_commit(commit.id().clone(), second_commit.id().clone()); .set_rewritten_commit(commit.id().clone(), second_commit.id().clone());
let num_rebased = if args.siblings { let mut num_rebased = 0;
rebase_children_for_siblings_split( tx.mut_repo().transform_descendants(
&mut tx, command.settings(),
command.settings(), vec![commit.id().clone()],
&commit, |mut rewriter| {
vec![first_commit.clone(), second_commit.clone()], num_rebased += 1;
)? if args.siblings {
} else { rewriter.replace_parent(
tx.mut_repo().rebase_descendants(command.settings())? second_commit.id(),
}; &[first_commit.id().clone(), second_commit.id().clone()],
);
}
// We don't need to do anything special for the non-siblings case
// since we already marked the original commit as rewritten.
rewriter.rebase(command.settings())?.write()?;
Ok(())
},
)?;
if let Some(mut formatter) = ui.status_formatter() { if let Some(mut formatter) = ui.status_formatter() {
if num_rebased > 0 { if num_rebased > 0 {
@ -203,36 +206,3 @@ the operation will be aborted.
tx.finish(ui, format!("split commit {}", commit.id().hex()))?; tx.finish(ui, format!("split commit {}", commit.id().hex()))?;
Ok(()) 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<Commit>,
) -> Result<usize, CommandError> {
let children: Vec<Commit> = 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 new_parents = child
.parents()
.into_iter()
.flat_map(|c| {
if c.id() == original_commit.id() {
new_siblings.clone()
} else {
vec![c]
}
})
.collect_vec();
num_rebased += rebase_descendants(tx, settings, new_parents, &[child], Default::default())?;
}
Ok(num_rebased)
}

View file

@ -346,8 +346,8 @@ fn test_split_siblings_no_descendants() {
let (stdout, stderr) = test_env.jj_cmd_ok(&workspace_path, &["split", "--siblings", "file1"]); let (stdout, stderr) = test_env.jj_cmd_ok(&workspace_path, &["split", "--siblings", "file1"]);
insta::assert_snapshot!(stdout, @""); insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @r###" insta::assert_snapshot!(stderr, @r###"
First part: qpvuntsm?? 8d2b7558 TESTED=TODO First part: qpvuntsm 8d2b7558 TESTED=TODO
Second part: zsuskuln acd41528 (no description set) Second part: zsuskuln acd41528 test_branch | (no description set)
Working copy now at: zsuskuln acd41528 test_branch | (no description set) Working copy now at: zsuskuln acd41528 test_branch | (no description set)
Parent commit : zzzzzzzz 00000000 (empty) (no description set) Parent commit : zzzzzzzz 00000000 (empty) (no description set)
Added 0 files, modified 0 files, removed 1 files Added 0 files, modified 0 files, removed 1 files