#[path = "src/version.rs"]
#[allow(dead_code)]
mod version;
use std::path::PathBuf;
use std::process::Command;
fn git(dir: &str, args: &[&str]) -> Option<String> {
let out = Command::new("git")
.args(args)
.current_dir(dir)
.output()
.ok()?;
if !out.status.success() {
return None;
}
Some(String::from_utf8_lossy(&out.stdout).trim().to_string())
}
fn gather(dir: &str) -> Option<version::GitFacts> {
let top = PathBuf::from(git(dir, &["rev-parse", "--show-toplevel"])?);
if top.canonicalize().ok()? != PathBuf::from(dir).canonicalize().ok()? {
return None;
}
let commit = git(dir, &["rev-parse", "--short", "HEAD"])?;
let branch = git(dir, &["symbolic-ref", "--short", "-q", "HEAD"]);
let describe = git(dir, &["describe", "--tags", "--long", "--match", "v*"]);
let modified = git(dir, &["status", "--porcelain", "--untracked-files=no"])
.map(|s| !s.is_empty())
.unwrap_or(false);
for path in ["HEAD", "index", "packed-refs"] {
if let Some(p) = git(dir, &["rev-parse", "--git-path", path]) {
println!("cargo:rerun-if-changed={p}");
}
}
if let Some(reference) = git(dir, &["symbolic-ref", "-q", "HEAD"]) {
if let Some(p) = git(dir, &["rev-parse", "--git-path", &reference]) {
println!("cargo:rerun-if-changed={p}");
}
}
Some(version::GitFacts {
branch,
commit,
describe,
modified,
})
}
fn main() {
let package = std::env::var("CARGO_PKG_VERSION").expect("cargo sets CARGO_PKG_VERSION");
let dir = std::env::var("CARGO_MANIFEST_DIR").expect("cargo sets CARGO_MANIFEST_DIR");
println!("cargo:rerun-if-changed=src");
println!("cargo:rerun-if-changed=Cargo.toml");
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=GITHUB_REF_TYPE");
println!("cargo:rerun-if-env-changed=GITHUB_REF_NAME");
let release_tag = std::env::var("GITHUB_REF_TYPE").as_deref() == Ok("tag")
&& std::env::var("GITHUB_REF_NAME").ok() == Some(format!("v{package}"));
let facts = if release_tag { None } else { gather(&dir) };
println!(
"cargo:rustc-env=PROC_VERSION={}",
version::format_version(&package, facts.as_ref())
);
}