use std::path::PathBuf;
use std::process::Command;
fn git(manifest_dir: &str, args: &[&str]) -> Option<String> {
let output = Command::new("git")
.arg("-C")
.arg(manifest_dir)
.args(args)
.output()
.ok()?;
if !output.status.success() {
return None;
}
let text = String::from_utf8(output.stdout).ok()?.trim().to_string();
(!text.is_empty()).then_some(text)
}
fn main() {
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| ".".to_string());
let version = std::env::var("CARGO_PKG_VERSION").unwrap_or_default();
match git(&manifest_dir, &["rev-parse", "--short", "HEAD"]) {
Some(hash) => {
println!("cargo:rustc-env=FRAME_GIT_HASH={hash}");
println!("cargo:rustc-env=FRAME_VERSION_LONG={version} ({hash})");
}
None => {
println!("cargo:rustc-env=FRAME_VERSION_LONG={version}");
}
}
let git_dir = git(&manifest_dir, &["rev-parse", "--absolute-git-dir"]).map(PathBuf::from);
let common_dir = git(
&manifest_dir,
&["rev-parse", "--path-format=absolute", "--git-common-dir"],
)
.map(PathBuf::from);
if let Some(dir) = &git_dir {
println!("cargo:rerun-if-changed={}", dir.join("HEAD").display());
}
if let Some(dir) = &common_dir {
println!(
"cargo:rerun-if-changed={}",
dir.join("packed-refs").display()
);
if let Some(head_ref) = git(&manifest_dir, &["symbolic-ref", "-q", "HEAD"]) {
println!("cargo:rerun-if-changed={}", dir.join(head_ref).display());
}
}
}