use std::path::Path;
use std::process::Command;
use anyhow::{Context, Result, bail};
use super::run_git;
pub fn branch_validate_name(name: &str) -> Result<()> {
let output = Command::new("git")
.args(["check-ref-format", "--branch", name])
.output()
.context("Failed to run git check-ref-format")?;
if !output.status.success() {
bail!("Branch name '{}' is not valid", name);
}
Ok(())
}
pub fn branch_create(workdir: &Path, name: &str, commit_hash: &str) -> Result<()> {
run_git(workdir, &["branch", name, commit_hash]).context("Failed to create branch")?;
Ok(())
}
pub fn branch_force_create(workdir: &Path, name: &str, commit_hash: &str) -> Result<()> {
run_git(workdir, &["branch", "-f", name, commit_hash])
.context("Failed to force-create branch")?;
Ok(())
}
pub fn branch_delete(workdir: &Path, name: &str) -> Result<()> {
run_git(workdir, &["branch", "-D", name])
.with_context(|| format!("Failed to delete branch '{}'", name))?;
Ok(())
}
pub fn branch_switch(workdir: &Path, name: &str) -> Result<()> {
run_git(workdir, &["switch", name])
.with_context(|| format!("Failed to switch to branch '{}'", name))?;
Ok(())
}
pub fn branch_switch_detach(workdir: &Path, refspec: &str) -> Result<()> {
run_git(workdir, &["switch", "--detach", refspec])
.with_context(|| format!("Failed to detach HEAD at '{}'", refspec))?;
Ok(())
}
pub fn branch_switch_create_tracking(workdir: &Path, name: &str, upstream: &str) -> Result<()> {
run_git(workdir, &["switch", "-c", name, "--track", upstream])
.context("Failed to create tracking branch")?;
Ok(())
}
pub fn branch_rename(workdir: &Path, old_name: &str, new_name: &str) -> Result<()> {
run_git(workdir, &["branch", "-m", old_name, new_name]).context("Failed to rename branch")?;
Ok(())
}