use clap_complete::ArgValueCandidates;
use itertools::Itertools as _;
use jj_lib::ref_name::WorkspaceNameBuf;
use jj_lib::workspace_store::SimpleWorkspaceStore;
use jj_lib::workspace_store::WorkspaceStore as _;
use tracing::instrument;
use crate::cli_util::CommandHelper;
use crate::command_error::CommandError;
use crate::complete;
use crate::ui::Ui;
#[derive(clap::Args, Clone, Debug)]
pub struct WorkspaceForgetArgs {
#[arg(add = ArgValueCandidates::new(complete::workspaces))]
workspaces: Vec<WorkspaceNameBuf>,
}
#[instrument(skip_all)]
pub async fn cmd_workspace_forget(
ui: &mut Ui,
command: &CommandHelper,
args: &WorkspaceForgetArgs,
) -> Result<(), CommandError> {
let mut workspace_command = command.workspace_helper(ui)?;
let wss = if args.workspaces.is_empty() {
vec![workspace_command.workspace_name().to_owned()]
} else {
args.workspaces.clone()
};
let mut forget_ws = Vec::new();
for ws in &wss {
if workspace_command
.repo()
.view()
.get_wc_commit_id(ws)
.is_none()
{
writeln!(
ui.warning_default(),
"No such workspace: {}",
ws.as_symbol(),
)?;
} else {
forget_ws.push(ws);
}
}
if forget_ws.is_empty() {
writeln!(ui.status(), "Nothing changed.")?;
return Ok(());
}
let workspace_store = SimpleWorkspaceStore::load(workspace_command.repo_path())?;
let mut tx = workspace_command.start_transaction();
for ws in &forget_ws {
tx.repo_mut().remove_wc_commit(ws).await?;
}
workspace_store.forget(&forget_ws.iter().map(|x| x.as_ref()).collect::<Vec<_>>())?;
let description = if let [ws] = forget_ws.as_slice() {
format!("forget workspace {}", ws.as_symbol())
} else {
format!(
"forget workspaces {}",
forget_ws.iter().map(|ws| ws.as_symbol()).join(", ")
)
};
tx.finish(ui, description).await?;
Ok(())
}