use std::process::Command;
fn main() {
println!("cargo::rerun-if-env-changed=GWK_PUBLIC_REVISION");
if let Some(revision) = from_env().or_else(from_clean_git) {
println!("cargo::rustc-env=GW_PUBLIC_REVISION={revision}");
}
}
fn from_env() -> Option<String> {
std::env::var("GWK_PUBLIC_REVISION")
.ok()
.filter(|value| is_revision(value))
}
fn from_clean_git() -> Option<String> {
if let Some(dir) = git(&["rev-parse", "--absolute-git-dir"]) {
println!("cargo::rerun-if-changed={dir}/HEAD");
}
if !git(&["status", "--porcelain"])?.is_empty() {
return None;
}
git(&["rev-parse", "HEAD"]).filter(|value| is_revision(value))
}
fn git(args: &[&str]) -> Option<String> {
let out = Command::new("git").args(args).output().ok()?;
if !out.status.success() {
return None;
}
Some(String::from_utf8(out.stdout).ok()?.trim().to_owned())
}
fn is_revision(value: &str) -> bool {
value.len() == 40
&& value
.bytes()
.all(|b| b.is_ascii_digit() || (b'a'..=b'f').contains(&b))
}