use anyhow::Result;
use clap::ArgAction;
use clap_complete::engine::ArgValueCompleter;
use crate::commands::Run;
use crate::completions;
use crate::providers::{detect_provider, review_provider};
use crate::style;
use crate::{git, stack};
#[derive(Debug, clap::Args)]
pub struct Rename {
#[arg(
required = true,
num_args = 1..=2,
value_name = "[BRANCH] NEW_NAME",
add = ArgValueCompleter::new(completions::branch_candidates),
)]
names: Vec<String>,
#[arg(long, action = ArgAction::SetTrue)]
dry_run: bool,
}
impl Run for Rename {
fn run(self) -> Result<()> {
let (old, new) = match self.names.as_slice() {
[new] => (git::current_branch()?, new.clone()),
[old, new] => (old.clone(), new.clone()),
_ => unreachable!("clap enforces one or two names"),
};
rename(&old, &new, self.dry_run)
}
}
fn rename(old: &str, new: &str, dry_run: bool) -> Result<()> {
stack::rename_branch(old, new, dry_run)?;
if let Ok(provider) = detect_provider() {
let review_provider = review_provider(provider.kind);
if let Ok(Some(review)) = review_provider.review_for_branch(old)
&& review.branch == *old
{
anstream::println!(
"{} review {} still heads {old}; submitting {new} will open a new review",
style::paint(style::WARN, "warning:"),
review.id
);
}
}
Ok(())
}