use jj_lib::object_id::ObjectId;
use tracing::instrument;
use crate::cli_util::{join_message_paragraphs, CommandError, CommandHelper, RevisionArg};
use crate::ui::Ui;
#[derive(clap::Args, Clone, Debug)]
#[command(visible_aliases = &["co"])]
pub(crate) struct CheckoutArgs {
revision: RevisionArg,
#[arg(short = 'r', hide = true)]
unused_revision: bool,
#[arg(long = "message", short, value_name = "MESSAGE")]
message_paragraphs: Vec<String>,
}
#[instrument(skip_all)]
pub(crate) fn cmd_checkout(
ui: &mut Ui,
command: &CommandHelper,
args: &CheckoutArgs,
) -> Result<(), CommandError> {
writeln!(
ui.warning(),
"warning: `jj checkout` is deprecated; use `jj new` instead, which is equivalent"
)?;
writeln!(
ui.warning(),
"warning: `jj checkout` will be removed in a future version, and this will be a hard error"
)?;
let mut workspace_command = command.workspace_helper(ui)?;
let target = workspace_command.resolve_single_rev(&args.revision, ui)?;
let mut tx = workspace_command.start_transaction();
let commit_builder = tx
.mut_repo()
.new_commit(
command.settings(),
vec![target.id().clone()],
target.tree_id().clone(),
)
.set_description(join_message_paragraphs(&args.message_paragraphs));
let new_commit = commit_builder.write()?;
tx.edit(&new_commit).unwrap();
tx.finish(ui, format!("check out commit {}", target.id().hex()))?;
Ok(())
}