use std::process::Command;
fn git(args: &[&str]) -> Option<String> {
let out = Command::new("git").args(args).output().ok()?;
if !out.status.success() {
return None;
}
let s = String::from_utf8(out.stdout).ok()?;
let s = s.trim().to_string();
if s.is_empty() { None } else { Some(s) }
}
fn main() {
if let Some(git_dir) = git(&["rev-parse", "--git-dir"]) {
println!("cargo:rerun-if-changed={git_dir}/HEAD");
println!("cargo:rerun-if-changed={git_dir}/packed-refs");
if let Some(head_ref) = git(&["rev-parse", "--symbolic-full-name", "HEAD"]) {
if head_ref != "HEAD" {
println!("cargo:rerun-if-changed={git_dir}/{head_ref}");
}
}
if let Some(top) = git(&["rev-parse", "--show-toplevel"]) {
for input in ["crates", "Cargo.toml", "Cargo.lock"] {
println!("cargo:rerun-if-changed={top}/{input}");
}
}
}
let sha = git(&["rev-parse", "--short", "HEAD"])
.map(|sha| {
let dirty = git(&[
"status",
"--porcelain",
"--untracked-files=no",
"--",
":/crates",
":/Cargo.toml",
":/Cargo.lock",
])
.is_some();
if dirty { format!("{sha}-dirty") } else { sha }
})
.unwrap_or_default();
println!("cargo:rustc-env=MEMSTEAD_BUILD_SHA={sha}");
}