use std::env;
use std::process::Command;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let hash = Command::new("git")
.arg("rev-parse")
.arg("--short")
.arg("HEAD")
.output()
.ok()
.and_then(|output| {
if output.status.success() {
String::from_utf8(output.stdout).ok()
} else {
None
}
})
.unwrap_or(env::var("GIT_HEAD").unwrap_or("unknown".into()));
let tags = Command::new("git")
.arg("tag")
.arg("--points-at")
.arg("HEAD")
.output()
.ok()
.and_then(|output| {
if output.status.success() {
String::from_utf8(output.stdout).ok()
} else {
None
}
})
.unwrap_or_default();
let tags = tags
.split_terminator('\n')
.filter_map(|s| s.strip_prefix('v'))
.collect::<Vec<_>>();
if tags.len() > 1 {
return Err("More than one version tag found for commit {hash}: {tags:?}".into());
}
let version = if let Some(version) = tags.first() {
Some((*version).to_owned())
} else {
Command::new("git")
.arg("describe")
.arg("--match=v*") .arg("--candidates=1") .arg("--abbrev=0") .arg("HEAD")
.output()
.ok()
.and_then(|output| {
if output.status.success() {
String::from_utf8(output.stdout).ok()
} else {
None
}
})
.map(|last| format!("{}-dev", last.trim()))
}
.unwrap_or(String::from("pre-release"));
let commit_time = Command::new("git")
.arg("show")
.arg("--format=%ct")
.arg("HEAD")
.output()
.ok()
.and_then(|output| {
if output.status.success() {
String::from_utf8(output.stdout).ok()
} else {
None
}
})
.unwrap_or(0.to_string());
println!("cargo::rustc-env=RADICLE_VERSION={version}");
println!("cargo::rustc-env=GIT_COMMIT_TIME={commit_time}");
println!("cargo::rustc-env=GIT_HEAD={hash}");
Ok(())
}