use std::process::Command;
fn git(args: &[&str]) -> Option<String> {
let dir = std::env::var("CARGO_MANIFEST_DIR").ok()?;
let out = Command::new("git")
.arg("-C")
.arg(dir)
.args(args)
.output()
.ok()?;
let text = String::from_utf8_lossy(&out.stdout).trim().to_owned();
(out.status.success() && !text.is_empty()).then_some(text)
}
fn main() {
println!("cargo:rerun-if-env-changed=CABOODLE_GIT_SHA");
for path in ["HEAD", "packed-refs"] {
if let Some(p) = git(&["rev-parse", "--git-path", path]) {
println!("cargo:rerun-if-changed={p}");
}
}
if let Some(reference) = git(&["symbolic-ref", "-q", "HEAD"]) {
if let Some(p) = git(&["rev-parse", "--git-path", &reference]) {
println!("cargo:rerun-if-changed={p}");
}
}
let own_checkout = || {
let top = std::fs::canonicalize(git(&["rev-parse", "--show-toplevel"])?).ok()?;
let manifest = std::fs::canonicalize(std::env::var("CARGO_MANIFEST_DIR").ok()?).ok()?;
(top == manifest).then_some(())
};
let sha = std::env::var("CABOODLE_GIT_SHA")
.ok()
.filter(|s| !s.is_empty())
.or_else(|| own_checkout().and_then(|()| git(&["rev-parse", "--short=12", "HEAD"])))
.unwrap_or_else(|| "unknown".to_owned());
println!("cargo:rustc-env=CABOODLE_GIT_SHA={sha}");
embed_members();
}
fn embed_members() {
let root = std::path::PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
let mut dirs = vec![root.join("members")];
if std::env::var_os("CARGO_FEATURE_FIXTURE_MEMBERS").is_some() {
assert!(
std::env::var("PROFILE").as_deref() != Ok("release"),
"the fixture-members feature is for tests only and refuses a release build"
);
dirs.push(root.join("tests/fixtures/members"));
}
let mut entries = Vec::new();
for dir in &dirs {
println!("cargo:rerun-if-changed={}", dir.display());
let Ok(read) = std::fs::read_dir(dir) else {
continue;
};
let mut files: Vec<_> = read
.filter_map(Result::ok)
.map(|e| e.path())
.filter(|p| p.extension().is_some_and(|x| x == "toml"))
.collect();
files.sort();
for f in files {
println!("cargo:rerun-if-changed={}", f.display());
entries.push(format!(
" include_str!({:?}),\n",
f.display().to_string()
));
}
}
let out =
std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap()).join("members_embedded.rs");
std::fs::write(out, format!("&[\n{}]", entries.concat())).unwrap();
}