sampo_core/
git.rs

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
11/// Detect the current git branch, preferring explicit overrides when provided.
12///
13/// Order of precedence:
14/// 1. `SAMPO_RELEASE_BRANCH`
15/// 2. `GITHUB_REF_NAME`
16/// 3. `git rev-parse --abbrev-ref HEAD`
17pub 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}