use std::process::Command;
fn main() {
println!("cargo:rustc-env=NEWGIT_BUILD={}", build_stamp());
println!("cargo:rerun-if-changed=../../.git/HEAD");
println!("cargo:rerun-if-changed=../../.git/refs/heads");
println!("cargo:rerun-if-env-changed=NEWGIT_BUILD");
}
fn build_stamp() -> String {
if let Ok(stamp) = std::env::var("NEWGIT_BUILD")
&& !stamp.trim().is_empty()
{
return stamp;
}
let Some(commit) = git(&["rev-parse", "--short=12", "HEAD"]) else {
return "unknown".to_owned();
};
let dirty = git(&["status", "--porcelain"]).is_some_and(|out| !out.is_empty());
if dirty {
format!("{commit}-dirty")
} else {
commit
}
}
fn git(args: &[&str]) -> Option<String> {
let output = Command::new("git").args(args).output().ok()?;
if !output.status.success() {
return None;
}
Some(String::from_utf8_lossy(&output.stdout).trim().to_owned())
}