use std::process::Command; use crate::bare::GitBare; use crate::error::{GitError, GitResult}; use crate::pb::{Branch, CreateBranchRequest, GetBranchRequest, object_selector}; impl GitBare { pub fn create_branch(&self, request: CreateBranchRequest) -> GitResult { crate::sanitize::validate_ref_name(&request.name)?; let revision = match request.start_point.and_then(|s| s.selector) { Some(object_selector::Selector::Oid(oid)) => oid.hex, Some(object_selector::Selector::Revision(name)) => { crate::sanitize::validate_revision(&name.revision)?; name.revision } None => "HEAD".into(), }; let mut args = vec!["branch".to_string()]; if request.force { args.push("-f".into()); } args.push(request.name.clone()); args.push(revision); let output = Command::new("git") .arg("--git-dir") .arg(&self.bare_dir) .args(&args) .output()?; if !output.status.success() { return Err(GitError::CommandFailed { status_code: output.status.code(), stderr: String::from_utf8_lossy(&output.stderr).into_owned(), }); } self.get_branch(GetBranchRequest { repository: request.repository, name: request.name, }) } }