use clap_complete::ArgValueCandidates;
use jj_lib::repo::Repo as _;
use tracing::instrument;
use crate::cli_util::CommandHelper;
use crate::command_error::CommandError;
use crate::commit_templater::WorkspaceRef;
use crate::complete;
use crate::templater::TemplateRenderer;
use crate::ui::Ui;
#[derive(clap::Args, Clone, Debug)]
pub struct WorkspaceListArgs {
#[arg(long, short = 'T')]
#[arg(add = ArgValueCandidates::new(complete::template_aliases))]
template: Option<String>,
}
#[instrument(skip_all)]
pub async fn cmd_workspace_list(
ui: &mut Ui,
command: &CommandHelper,
args: &WorkspaceListArgs,
) -> Result<(), CommandError> {
let workspace_command = command.workspace_helper(ui)?;
let template: TemplateRenderer<WorkspaceRef> = {
let language = workspace_command.commit_template_language();
let text = match &args.template {
Some(value) => value.to_owned(),
None => workspace_command
.settings()
.get("templates.workspace_list")?,
};
workspace_command
.parse_template(ui, &language, &text)?
.labeled(["workspace_list"])
};
let repo = workspace_command.repo();
let mut formatter = ui.stdout_formatter();
for (name, wc_commit_id) in repo.view().wc_commit_ids() {
let commit = repo.store().get_commit_async(wc_commit_id).await?;
let ws_ref = WorkspaceRef::new(name.clone(), commit);
template.format(&ws_ref, formatter.as_mut())?;
}
Ok(())
}