use crate::bare::GitBare; use crate::error::{GitError, GitResult}; use crate::pb::{CreateTagRequest, GetTagRequest, Tag}; impl GitBare { pub fn create_tag(&self, request: CreateTagRequest) -> GitResult { crate::sanitize::validate_ref_name(&request.name)?; let target = match request.target.and_then(|s| s.selector) { Some(crate::pb::object_selector::Selector::Oid(oid)) => oid.hex, Some(crate::pb::object_selector::Selector::Revision(name)) => { crate::sanitize::validate_revision(&name.revision)?; name.revision } None => "HEAD".into(), }; let mut args = vec![ "--git-dir".to_string(), self.bare_dir.to_string_lossy().into_owned(), "tag".to_string(), ]; if request.force { args.push("--force".into()); } if request.annotated { args.push("--annotate".into()); if !request.message.is_empty() { args.push("-m".into()); args.push(request.message.clone()); } } args.push(request.name.clone()); args.push(target); let result = duct::cmd("git", &args) .stdout_capture() .stderr_capture() .unchecked() .run()?; if !result.status.success() { return Err(GitError::CommandFailed { status_code: result.status.code(), stderr: String::from_utf8_lossy(&result.stderr).into_owned(), }); } self.get_tag(GetTagRequest { repository: request.repository, name: request.name, include_raw: false, }) } }