use radicle::prelude::*;
use crate::git;
use radicle::git::fmt::RefStr;
use radicle::node::NodeId;
pub struct SetupRemote<'a> {
pub rid: RepoId,
pub tracking: Option<BranchName>,
pub fetch: bool,
pub repo: &'a git::Repository,
}
impl SetupRemote<'_> {
pub fn run(
&self,
name: impl AsRef<RefStr>,
node: NodeId,
) -> anyhow::Result<(git::Remote<'_>, Option<BranchName>)> {
let remote_url = radicle::git::Url::from(self.rid).with_namespace(node);
let remote_name = name.as_ref();
if git::is_remote(self.repo, remote_name)? {
anyhow::bail!("remote `{remote_name}` already exists");
}
let remote =
radicle::git::configure_remote(self.repo, remote_name, &remote_url, &remote_url)?;
let mut remote = git::Remote::try_from(remote)?;
if self.fetch {
remote.fetch::<&str>(&[], None, None)?;
}
if let Some(branch) = &self.tracking {
let tracking_branch = remote_name.join(branch);
let local_branch = radicle::git::refs::workdir::branch(tracking_branch.as_refstr());
radicle::git::set_upstream(self.repo, remote_name, &tracking_branch, local_branch)?;
return Ok((remote, Some(tracking_branch)));
}
Ok((remote, None))
}
}