From 17bcac6838fc9884ca6f47b6bea749e392db2214 Mon Sep 17 00:00:00 2001 From: Austin Seipp Date: Fri, 3 Nov 2023 13:10:01 -0500 Subject: [PATCH] cli: move `resolve_destination_revs` to `cli_utils` and rename Summary: This is currently used by `new.rs`, `workspace.rs`, and `rebase.rs`, and may be useful for other commands and custom CLIs. So just go ahead and move it into the parent module hierarchy. Also rename the function to `resolve_all_revs`, as it isn't actually specific to rebase at all. Signed-off-by: Austin Seipp Change-Id: I0ea12afd8107f95a37a91340820221a0 --- cli/src/cli_util.rs | 17 +++++++++++++++++ cli/src/commands/new.rs | 3 +-- cli/src/commands/rebase.rs | 23 +++-------------------- cli/src/commands/workspace.rs | 12 ++++-------- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/cli/src/cli_util.rs b/cli/src/cli_util.rs index 48d587475..6ddfd9720 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 91801dca2..49d187a87 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 5e9e45454..6cfbfe8be 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 088b11da4..9da722e17 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)?;