use std::process::Command;
fn main() {
let pkg_version = std::env::var("CARGO_PKG_VERSION").unwrap_or_else(|_| "0.0.0".into());
let version = match resolve_hash() {
Some((hash, dirty)) => {
let suffix = if dirty { "-dirty" } else { "" };
format!("{pkg_version} ({hash}{suffix})")
}
None => pkg_version,
};
println!("cargo:rustc-env=RTCOM_VERSION={version}");
println!("cargo:rerun-if-changed=../../.git/HEAD");
println!("cargo:rerun-if-changed=../../.git/refs/heads");
println!("cargo:rerun-if-changed=.commit-hash");
}
fn resolve_hash() -> Option<(String, bool)> {
if let Some(hash) = short_hash() {
return Some((hash, working_tree_is_dirty()));
}
if let Some(hash) = read_baked_hash() {
return Some((hash, false));
}
None
}
fn short_hash() -> Option<String> {
let output = Command::new("git")
.args(["rev-parse", "--short=8", "HEAD"])
.output()
.ok()?;
if !output.status.success() {
return None;
}
let hash = String::from_utf8(output.stdout).ok()?.trim().to_string();
if hash.is_empty() {
None
} else {
Some(hash)
}
}
fn read_baked_hash() -> Option<String> {
let raw = std::fs::read_to_string(".commit-hash").ok()?;
let hash = raw.trim().to_string();
if hash.is_empty() {
None
} else {
Some(hash)
}
}
fn working_tree_is_dirty() -> bool {
Command::new("git")
.args(["diff", "--quiet"])
.status()
.map(|s| !s.success())
.unwrap_or(false)
}