use std::env; use std::process::Command; fn git(args: &[&str]) -> Option { let output = Command::new("git").args(args).output().ok()?; if !output.status.success() { return None; } let text = String::from_utf8(output.stdout).ok()?; Some(text.trim().to_string()) } fn main() { println!("cargo:rerun-if-changed=.git/HEAD"); println!("cargo:rerun-if-changed=.git/index"); println!("cargo:rerun-if-env-changed=DOSH_BUILD_GIT_HASH"); println!("cargo:rerun-if-env-changed=DOSH_BUILD_COMMIT_DATE"); println!("cargo:rerun-if-env-changed=DOSH_BUILD_GIT_DIRTY"); let hash = env::var("DOSH_BUILD_GIT_HASH") .ok() .filter(|value| !value.is_empty()) .or_else(|| git(&["rev-parse", "--short=12", "HEAD"])) .unwrap_or_else(|| "unknown".into()); let date = env::var("DOSH_BUILD_COMMIT_DATE") .ok() .filter(|value| !value.is_empty()) .or_else(|| git(&["show", "-s", "--format=%cs", "HEAD"])) .unwrap_or_else(|| "unknown".into()); let dirty = match env::var("DOSH_BUILD_GIT_DIRTY").ok().as_deref() { Some("1" | "true" | "yes" | "+dirty") => "+dirty", Some(_) => "", None => Command::new("git") .args(["diff", "--quiet", "--ignore-submodules", "--"]) .status() .map(|status| if status.success() { "" } else { "+dirty" }) .unwrap_or(""), }; println!("cargo:rustc-env=DOSH_GIT_HASH={hash}{dirty}"); println!("cargo:rustc-env=DOSH_COMMIT_DATE={date}"); }