43 lines
1.5 KiB
Rust
43 lines
1.5 KiB
Rust
use std::env;
|
|
use std::process::Command;
|
|
|
|
fn git(args: &[&str]) -> Option<String> {
|
|
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}");
|
|
}
|