mod git;
use chrono::{Datelike, TimeZone};
use std::convert::TryInto;
use std::time::SystemTime;
use std::{env, fs, path};
pub fn info() {
let crate_dir =
path::PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"));
let mut repo_dir = crate_dir.clone();
let git_info = git::repo_hash(&repo_dir).or_else(move || {
repo_dir.pop();
git::repo_hash(&repo_dir)
});
let (commit_id, commit_date) = git_info.unwrap_or_else(|| {
let date = cargo_metadata_release_date(&crate_dir)
.or_else(|| cargo_mtime_date(&crate_dir))
.unwrap_or_else(chrono::Utc::now);
("RELEASE".into(), date.format("%Y-%m-%d").to_string())
});
println!("cargo:rustc-env=COMMIT_ID={commit_id}");
println!("cargo:rustc-env=BUILD_REL_DATE={commit_date}");
}
fn cargo_metadata_release_date(crate_dir: &path::Path) -> Option<chrono::DateTime<chrono::Utc>> {
use std::io::prelude::*;
let mut cargo_toml = path::PathBuf::from(crate_dir);
cargo_toml.push("Cargo.toml");
let mut file = fs::File::open(&cargo_toml).ok()?;
let mut contents = String::new();
file.read_to_string(&mut contents).ok()?;
let doc = contents.parse::<toml_edit::DocumentMut>().ok()?;
let release_date = doc
.get("package")
.and_then(|package| package.as_table_like())
.and_then(|package| package.get("metadata"))
.and_then(|metadata| metadata.as_table_like())
.and_then(|metadata| metadata.get("gstreamer"))
.and_then(|gstreamer| gstreamer.as_table_like())
.and_then(|gstreamer| gstreamer.get("release_date"))
.and_then(|release_date| release_date.as_str())?;
let release_date = release_date.parse::<chrono::NaiveDate>().ok()?;
Some(chrono::DateTime::from_naive_utc_and_offset(
release_date.and_hms_opt(0, 0, 0)?,
chrono::Utc,
))
}
fn cargo_mtime_date(crate_dir: &path::Path) -> Option<chrono::DateTime<chrono::Utc>> {
let mut cargo_toml = path::PathBuf::from(crate_dir);
cargo_toml.push("Cargo.toml");
let metadata = fs::metadata(&cargo_toml).ok()?;
let mtime = metadata.modified().ok()?;
let unix_time = mtime.duration_since(SystemTime::UNIX_EPOCH).ok()?;
let dt = chrono::Utc
.timestamp_opt(unix_time.as_secs().try_into().ok()?, 0)
.latest()?;
if dt.date_naive().year() < 2015 {
return None;
}
Some(dt)
}