use clap_complete::ArgValueCandidates;
use jj_lib::git;
use jj_lib::ref_name::RemoteNameBuf;
use jj_lib::repo::Repo as _;
use crate::cli_util::CommandHelper;
use crate::command_error::CommandError;
use crate::complete;
use crate::git_util::absolute_git_url;
use crate::ui::Ui;
#[derive(clap::Args, Clone, Debug)]
pub struct GitRemoteSetUrlArgs {
#[arg(add = ArgValueCandidates::new(complete::git_remotes))]
remote: RemoteNameBuf,
#[arg(value_hint = clap::ValueHint::Url)]
url: Option<String>,
#[arg(long, value_hint = clap::ValueHint::Url)]
push: Option<String>,
#[arg(long, value_hint = clap::ValueHint::Url, conflicts_with = "url")]
fetch: Option<String>,
}
pub async fn cmd_git_remote_set_url(
ui: &mut Ui,
command: &CommandHelper,
args: &GitRemoteSetUrlArgs,
) -> Result<(), CommandError> {
let workspace_command = command.workspace_helper(ui)?;
let process_url = |url: Option<&String>| {
url.map(|url| absolute_git_url(command.cwd(), url))
.transpose()
};
let fetch_url = process_url(args.url.as_ref().or(args.fetch.as_ref()))?;
let push_url = process_url(args.push.as_ref())?;
git::set_remote_urls(
workspace_command.repo().store(),
&args.remote,
fetch_url.as_deref(),
push_url.as_deref(),
)?;
Ok(())
}