use jj_lib::git;
use jj_lib::ref_name::RemoteNameBuf;
use crate::cli_util::CommandHelper;
use crate::command_error::CommandError;
use crate::commands::git::FetchTagsMode;
use crate::git_util::absolute_git_url;
use crate::ui::Ui;
#[derive(clap::Args, Clone, Debug)]
pub struct GitRemoteAddArgs {
remote: RemoteNameBuf,
#[arg(value_hint = clap::ValueHint::Url)]
url: String,
#[arg(long, value_enum, default_value_t = FetchTagsMode::Included)]
fetch_tags: FetchTagsMode,
#[arg(long, value_hint = clap::ValueHint::Url)]
push_url: Option<String>,
}
pub async fn cmd_git_remote_add(
ui: &mut Ui,
command: &CommandHelper,
args: &GitRemoteAddArgs,
) -> Result<(), CommandError> {
let mut workspace_command = command.workspace_helper(ui)?;
let url = absolute_git_url(command.cwd(), &args.url)?;
let push_url = args
.push_url
.as_deref()
.map(|url| absolute_git_url(command.cwd(), url))
.transpose()?;
let mut tx = workspace_command.start_transaction();
git::add_remote(
tx.repo_mut(),
&args.remote,
&url,
push_url.as_deref(),
args.fetch_tags.as_fetch_tags(),
)?;
tx.finish(ui, format!("add git remote {}", args.remote.as_symbol()))
.await?;
Ok(())
}