fn main() {
let sha = resolve_git_sha();
println!("cargo:rustc-env=APR_GIT_SHA={sha}");
register_git_rerun_triggers();
println!("cargo:rerun-if-env-changed=APR_GIT_SHA_OVERRIDE");
println!("cargo:rerun-if-changed=.git-sha");
}
fn register_git_rerun_triggers() {
if let Some(git_dir) = run_git(&["rev-parse", "--git-dir"]) {
let head = format!("{git_dir}/HEAD");
if std::path::Path::new(&head).exists() {
println!("cargo:rerun-if-changed={head}");
}
}
if let Some(common_dir) = run_git(&["rev-parse", "--git-common-dir"]) {
let refs = format!("{common_dir}/refs/heads");
if std::path::Path::new(&refs).exists() {
println!("cargo:rerun-if-changed={refs}");
}
}
}
fn run_git(args: &[&str]) -> Option<String> {
let out = std::process::Command::new("git").args(args).output().ok()?;
if !out.status.success() {
return None;
}
let s = String::from_utf8_lossy(&out.stdout).trim().to_string();
if s.is_empty() {
None
} else {
Some(s)
}
}
fn resolve_git_sha() -> String {
if let Ok(s) = std::env::var("APR_GIT_SHA_OVERRIDE") {
let s = s.trim();
if !s.is_empty() {
return s.to_string();
}
}
if let Some(sha) = run_git(&["rev-parse", "--short", "HEAD"]) {
return sha;
}
if let Ok(contents) = std::fs::read_to_string(".git-sha") {
let s = contents.trim().to_string();
if !s.is_empty() {
return s;
}
}
let version = std::env::var("CARGO_PKG_VERSION").unwrap_or_else(|_| "0.0.0".to_string());
format!("v{version}+no-git")
}