use std::process::Command;
const CHANGELOG_RELEASE_LIMIT: usize = 10;
fn git(args: &[&str]) -> Option<String> {
let out = Command::new("git").args(args).output().ok()?;
if !out.status.success() {
return None;
}
Some(String::from_utf8_lossy(&out.stdout).trim().to_string())
}
fn build_embedded_changelog() -> std::io::Result<String> {
let content = std::fs::read_to_string("CHANGELOG.md")?;
let mut releases = 0;
Ok(content
.split_inclusive('\n')
.skip_while(|line| !line.starts_with("## v"))
.take_while(|line| {
if line.starts_with("## v") {
releases += 1;
}
releases <= CHANGELOG_RELEASE_LIMIT
})
.collect())
}
fn build_git_info() -> String {
git(&["describe", "--always", "--dirty"])
.filter(|desc| !desc.is_empty())
.unwrap_or_else(|| "no git metadata".to_string())
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("cargo:rerun-if-changed=.git/refs/tags");
println!("cargo:rerun-if-changed=.git/packed-refs");
println!("cargo:rerun-if-changed=Cargo.toml");
println!("cargo:rerun-if-changed=CHANGELOG.md");
println!("cargo:rerun-if-changed=.git/HEAD");
println!("cargo:rerun-if-changed=.git/index");
let text = build_embedded_changelog()?;
let out_dir = std::env::var_os("OUT_DIR").ok_or("OUT_DIR is not set")?;
std::fs::write(std::path::PathBuf::from(out_dir).join("changelog.txt"), text)?;
println!("cargo:rustc-env=AID_GIT_INFO={}", build_git_info());
Ok(())
}