pub fn resolve_git_sha() -> Option<String> {
if let Ok(sha) = std::env::var("GITHUB_SHA") {
let trimmed = sha.trim().to_string();
if !trimmed.is_empty() {
return Some(trimmed);
}
}
std::process::Command::new("git")
.args(["rev-parse", "HEAD"])
.output()
.ok()
.filter(|output| output.status.success())
.and_then(|output| String::from_utf8(output.stdout).ok())
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
}
#[cfg(test)]
mod tests {
use super::resolve_git_sha;
#[test]
fn resolve_git_sha_succeeds_in_git_checkout() {
let sha = resolve_git_sha();
assert!(
sha.is_some(),
"expected git rev-parse HEAD in this workspace; set GITHUB_SHA in CI"
);
assert_eq!(sha.as_ref().unwrap().len(), 40, "full git sha hex length");
}
}