use std::path::PathBuf;
use std::process::Command;
fn main() {
println!("cargo:rerun-if-changed=build.rs");
emit_git_rerun_hints();
let git_sha = Command::new("git")
.args(["rev-parse", "--short", "HEAD"])
.output()
.ok()
.filter(|o| o.status.success())
.map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string())
.filter(|s| !s.is_empty())
.unwrap_or_else(|| "unknown".to_string());
println!("cargo::rustc-env=SHIPPER_GIT_SHA={git_sha}");
let profile = std::env::var("PROFILE").unwrap_or_else(|_| "unknown".to_string());
println!("cargo::rustc-env=SHIPPER_BUILD_PROFILE={profile}");
let rustc_version =
Command::new(std::env::var("RUSTC").unwrap_or_else(|_| "rustc".to_string()))
.arg("--version")
.output()
.ok()
.filter(|o| o.status.success())
.map(|o| {
String::from_utf8_lossy(&o.stdout)
.lines()
.next()
.unwrap_or("")
.trim()
.to_string()
})
.filter(|s| !s.is_empty())
.unwrap_or_else(|| "unknown".to_string());
println!("cargo::rustc-env=SHIPPER_RUSTC_VERSION={rustc_version}");
}
fn emit_git_rerun_hints() {
if let Some(head_path) = git_path("HEAD") {
println!("cargo:rerun-if-changed={}", head_path.display());
}
if let Some(current_ref) = git_stdout(&["symbolic-ref", "-q", "HEAD"])
&& let Some(ref_path) = git_path(¤t_ref)
{
println!("cargo:rerun-if-changed={}", ref_path.display());
}
if let Some(packed_refs) = git_path("packed-refs") {
println!("cargo:rerun-if-changed={}", packed_refs.display());
}
}
fn git_path(spec: &str) -> Option<PathBuf> {
git_stdout(&["rev-parse", "--git-path", spec]).map(PathBuf::from)
}
fn git_stdout(args: &[&str]) -> Option<String> {
Command::new("git")
.args(args)
.output()
.ok()
.filter(|output| output.status.success())
.map(|output| String::from_utf8_lossy(&output.stdout).trim().to_string())
.filter(|stdout| !stdout.is_empty())
}