1use crate::errors::{Result, SampoError};
2use std::process::Command;
3
4fn read_env_branch(key: &str) -> Option<String> {
5 std::env::var(key)
6 .ok()
7 .map(|s| s.trim().to_string())
8 .filter(|s| !s.is_empty())
9}
10
11pub fn current_branch() -> Result<String> {
18 if let Some(branch) = read_env_branch("SAMPO_RELEASE_BRANCH") {
19 return Ok(branch);
20 }
21
22 if let Some(branch) = read_env_branch("GITHUB_REF_NAME") {
23 return Ok(branch);
24 }
25
26 let output = Command::new("git")
27 .args(["rev-parse", "--abbrev-ref", "HEAD"])
28 .output()
29 .map_err(SampoError::Io)?;
30
31 if !output.status.success() {
32 return Err(SampoError::Release(
33 "Unable to determine current git branch (git rev-parse failed)".into(),
34 ));
35 }
36
37 let branch = String::from_utf8_lossy(&output.stdout)
38 .trim()
39 .trim_start_matches("refs/heads/")
40 .to_string();
41
42 if branch.is_empty() || branch == "HEAD" {
43 return Err(SampoError::Release(
44 "Unable to determine current git branch (detached HEAD)".into(),
45 ));
46 }
47
48 Ok(branch)
49}