use std::process::Command;
fn main() {
let git_hash =
git_text(&["rev-parse", "--short=12", "HEAD"]).unwrap_or_else(|| "unknown".into());
let dirty = match git_raw(&["status", "--porcelain", "--untracked-files=no"]) {
Some(out) if !out.trim().is_empty() => "dirty",
Some(_) => "clean",
None => "unknown",
};
let commit_time =
git_text(&["log", "-1", "--format=%cI", "HEAD"]).unwrap_or_else(|| "unknown".into());
println!("cargo:rustc-env=PACEFLOW_GIT_HASH={git_hash}");
println!("cargo:rustc-env=PACEFLOW_GIT_DIRTY={dirty}");
println!("cargo:rustc-env=PACEFLOW_GIT_COMMIT_TIME={commit_time}");
println!("cargo:rerun-if-changed=.git/HEAD");
println!("cargo:rerun-if-changed=.git/index");
println!("cargo:rerun-if-changed=build.rs");
}
fn git_text(args: &[&str]) -> Option<String> {
let value = git_raw(args)?.trim().to_string();
if value.is_empty() { None } else { Some(value) }
}
fn git_raw(args: &[&str]) -> Option<String> {
let output = Command::new("git").args(args).output().ok()?;
if !output.status.success() {
return None;
}
String::from_utf8(output.stdout).ok()
}