diff --git a/cli/src/cli_util.rs b/cli/src/cli_util.rs index 48d5874756..6ddfd9720d 100644 --- a/cli/src/cli_util.rs +++ b/cli/src/cli_util.rs @@ -1907,6 +1907,23 @@ fn resolve_single_op( Ok(operation) } +/// Resolves revsets into revisions for use; useful for rebases or operations +/// that take multiple parents. +pub fn resolve_all_revs( + workspace_command: &WorkspaceCommandHelper, + ui: &mut Ui, + revisions: &[RevisionArg], +) -> Result, CommandError> { + let commits = + resolve_multiple_nonempty_revsets_default_single(workspace_command, ui, revisions)?; + let root_commit_id = workspace_command.repo().store().root_commit_id(); + if commits.len() >= 2 && commits.iter().any(|c| c.id() == root_commit_id) { + Err(user_error("Cannot merge with root revision")) + } else { + Ok(commits) + } +} + fn find_all_operations( op_store: &Arc, op_heads_store: &Arc, diff --git a/cli/src/commands/new.rs b/cli/src/commands/new.rs index 91801dca20..49d187a879 100644 --- a/cli/src/commands/new.rs +++ b/cli/src/commands/new.rs @@ -25,7 +25,6 @@ use tracing::instrument; use crate::cli_util::{ self, short_commit_hash, user_error, CommandError, CommandHelper, RevisionArg, }; -use crate::commands::rebase::resolve_destination_revs; use crate::ui::Ui; /// Create a new, empty change and edit it in the working copy @@ -76,7 +75,7 @@ Please use `jj new 'all:x|y'` instead of `jj new --allow-large-revsets x y`.", !args.revisions.is_empty(), "expected a non-empty list from clap" ); - let target_commits = resolve_destination_revs(&workspace_command, ui, &args.revisions)? + let target_commits = cli_util::resolve_all_revs(&workspace_command, ui, &args.revisions)? .into_iter() .collect_vec(); let target_ids = target_commits.iter().map(|c| c.id().clone()).collect_vec(); diff --git a/cli/src/commands/rebase.rs b/cli/src/commands/rebase.rs index 5e9e45454f..6cfbfe8beb 100644 --- a/cli/src/commands/rebase.rs +++ b/cli/src/commands/rebase.rs @@ -27,8 +27,8 @@ use jj_lib::settings::UserSettings; use tracing::instrument; use crate::cli_util::{ - resolve_multiple_nonempty_revsets_default_single, short_commit_hash, user_error, CommandError, - CommandHelper, RevisionArg, WorkspaceCommandHelper, + self, resolve_multiple_nonempty_revsets_default_single, short_commit_hash, user_error, + CommandError, CommandHelper, RevisionArg, WorkspaceCommandHelper, }; use crate::ui::Ui; @@ -161,7 +161,7 @@ Please use `jj rebase -d 'all:x|y'` instead of `jj rebase --allow-large-revsets )); } let mut workspace_command = command.workspace_helper(ui)?; - let new_parents = resolve_destination_revs(&workspace_command, ui, &args.destination)? + let new_parents = cli_util::resolve_all_revs(&workspace_command, ui, &args.destination)? .into_iter() .collect_vec(); if let Some(rev_str) = &args.revision { @@ -390,20 +390,3 @@ fn check_rebase_destinations( } Ok(()) } - -/// Resolves revsets into revisions to rebase onto. These revisions don't have -/// to be rewriteable. -pub(crate) fn resolve_destination_revs( - workspace_command: &WorkspaceCommandHelper, - ui: &mut Ui, - revisions: &[RevisionArg], -) -> Result, CommandError> { - let commits = - resolve_multiple_nonempty_revsets_default_single(workspace_command, ui, revisions)?; - let root_commit_id = workspace_command.repo().store().root_commit_id(); - if commits.len() >= 2 && commits.iter().any(|c| c.id() == root_commit_id) { - Err(user_error("Cannot merge with root revision")) - } else { - Ok(commits) - } -} diff --git a/cli/src/commands/workspace.rs b/cli/src/commands/workspace.rs index 76e5acdcc7..23e82ce6c4 100644 --- a/cli/src/commands/workspace.rs +++ b/cli/src/commands/workspace.rs @@ -27,7 +27,7 @@ use jj_lib::workspace::{default_working_copy_initializer, Workspace}; use tracing::instrument; use crate::cli_util::{ - check_stale_working_copy, print_checkout_stats, user_error, CommandError, CommandHelper, + self, check_stale_working_copy, print_checkout_stats, user_error, CommandError, CommandHelper, RevisionArg, WorkspaceCommandHelper, }; use crate::ui::Ui; @@ -192,13 +192,9 @@ fn cmd_workspace_add( vec![tx.repo().store().root_commit()] } } else { - crate::commands::rebase::resolve_destination_revs( - &old_workspace_command, - ui, - &args.revision, - )? - .into_iter() - .collect_vec() + cli_util::resolve_all_revs(&old_workspace_command, ui, &args.revision)? + .into_iter() + .collect_vec() }; let tree = merge_commit_trees(tx.repo(), &parents)?;