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_lossy(&out.stdout).trim().to_string();
(!s.is_empty()).then_some(s)
}
fn git_ref() -> Option<String> {
if let Some(tag) = git(&["describe", "--tags", "--exact-match", "HEAD"]) {
return Some(format!("tag {tag}"));
}
if let Some(branch) = git(&["symbolic-ref", "--short", "-q", "HEAD"]) {
return Some(format!("branch {branch}"));
}
git(&["rev-parse", "--short", "HEAD"]).map(|sha| format!("commit {sha}"))
}
fn main() {
if let Some(gitdir) = git(&["rev-parse", "--absolute-git-dir"]) {
println!("cargo:rerun-if-changed={gitdir}/HEAD");
println!("cargo:rerun-if-changed={gitdir}/packed-refs");
if let Some(head_ref) = git(&["symbolic-ref", "-q", "HEAD"]) {
println!("cargo:rerun-if-changed={gitdir}/{head_ref}");
}
}
println!("cargo:rerun-if-env-changed=PROFILE");
let profile = std::env::var("PROFILE").unwrap_or_else(|_| "debug".into());
let star = if profile == "debug" { "*" } else { "" };
let version = std::env::var("CARGO_PKG_VERSION").unwrap_or_default();
let git_suffix = git_ref().map(|r| format!(", {r}")).unwrap_or_default();
println!("cargo:rustc-env=DAY_VERSION_LONG={version}{star} ({profile}{git_suffix})");
}