pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub const GIT_SHA: &str = env!("MOLD_GIT_SHA");
pub const SHORT_GIT_SHA: &str = env!("MOLD_GIT_SHA_SHORT");
pub const SHORT_SHA_LENGTH: usize = 7;
pub const BUILD_DATE: &str = env!("MOLD_BUILD_DATE");
pub const FULL_VERSION: &str = env!("MOLD_FULL_VERSION");
pub fn version_string() -> String {
if SHORT_GIT_SHA == "unknown" {
VERSION.to_string()
} else {
format!("{VERSION} ({SHORT_GIT_SHA} {BUILD_DATE})")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn version_matches_cargo_pkg() {
assert_eq!(VERSION, env!("CARGO_PKG_VERSION"));
}
#[test]
fn git_sha_is_populated() {
assert!(!GIT_SHA.is_empty());
if GIT_SHA == "unknown" {
return; }
assert!(
(7..=12).contains(&GIT_SHA.len()) || GIT_SHA.len() == 40,
"SHA should be a 7-12 character abbreviation or exact 40-character commit, got {}: {GIT_SHA}",
GIT_SHA.len()
);
assert!(
GIT_SHA.chars().all(|c| c.is_ascii_hexdigit()),
"SHA should be hex: {GIT_SHA}"
);
}
#[test]
fn build_date_is_valid() {
assert!(!BUILD_DATE.is_empty());
if BUILD_DATE == "unknown" {
return; }
assert_eq!(
BUILD_DATE.len(),
10,
"date should be YYYY-MM-DD: {BUILD_DATE}"
);
let parts: Vec<&str> = BUILD_DATE.split('-').collect();
assert_eq!(parts.len(), 3, "date should have 3 parts: {BUILD_DATE}");
assert!(parts[0].parse::<u32>().is_ok(), "year should be numeric");
assert!(parts[1].parse::<u32>().is_ok(), "month should be numeric");
assert!(parts[2].parse::<u32>().is_ok(), "day should be numeric");
}
#[test]
fn version_string_includes_all_components() {
let vs = version_string();
assert!(vs.contains(VERSION), "should contain version: {vs}");
if SHORT_GIT_SHA != "unknown" {
assert!(vs.contains(SHORT_GIT_SHA), "should contain SHA: {vs}");
assert!(vs.contains(BUILD_DATE), "should contain date: {vs}");
}
}
#[test]
fn displayed_sha_width_is_independent_of_the_exact_sha() {
if SHORT_GIT_SHA == "unknown" {
assert_eq!(GIT_SHA, "unknown");
return;
}
assert_eq!(
SHORT_GIT_SHA.len(),
SHORT_SHA_LENGTH,
"displayed SHA must be exactly {SHORT_SHA_LENGTH} characters, got {SHORT_GIT_SHA}"
);
assert!(
GIT_SHA.starts_with(SHORT_GIT_SHA),
"displayed SHA must abbreviate the exact one: {SHORT_GIT_SHA} vs {GIT_SHA}"
);
assert!(
!version_string().contains(GIT_SHA) || GIT_SHA.len() == SHORT_SHA_LENGTH,
"the exact SHA must not reach a human-facing version string"
);
}
}