pub const BUILD_SHA: &str = env!("MEMSTEAD_BUILD_SHA");
pub fn full_version() -> &'static str {
static FULL: std::sync::OnceLock<String> = std::sync::OnceLock::new();
FULL.get_or_init(|| {
if BUILD_SHA.is_empty() {
crate::ENGINE_VERSION.to_string()
} else {
format!("{}+g{}", crate::ENGINE_VERSION, BUILD_SHA)
}
})
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum SkewDirection {
StampedNewer,
StampedOlder,
}
pub fn skew_direction(stamped: &str, running: &str) -> Option<SkewDirection> {
let (a, b) = (
stamped.parse::<semver::Version>().ok()?,
running.parse::<semver::Version>().ok()?,
);
match a.cmp_precedence(&b) {
std::cmp::Ordering::Greater => Some(SkewDirection::StampedNewer),
std::cmp::Ordering::Less => Some(SkewDirection::StampedOlder),
std::cmp::Ordering::Equal => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn full_version_is_semver_with_optional_build_sha() {
let full = full_version();
if BUILD_SHA.is_empty() {
assert_eq!(full, crate::ENGINE_VERSION);
} else {
assert_eq!(
full,
format!("{}+g{}", crate::ENGINE_VERSION, BUILD_SHA).as_str()
);
}
let parsed: semver::Version = full.parse().expect("full build version parses as semver");
let bare: semver::Version = crate::ENGINE_VERSION.parse().unwrap();
assert_eq!(
(parsed.major, parsed.minor, parsed.patch),
(bare.major, bare.minor, bare.patch)
);
}
#[test]
fn skew_is_semver_difference_and_never_a_build_hash() {
use super::{SkewDirection, skew_direction};
assert_eq!(
skew_direction("0.11.0", "0.12.0"),
Some(SkewDirection::StampedOlder)
);
assert_eq!(
skew_direction("0.13.0", "0.12.0"),
Some(SkewDirection::StampedNewer)
);
assert_eq!(skew_direction("0.12.0+gabc123", "0.12.0+gdef456"), None);
assert_eq!(skew_direction("0.12.0", "0.12.0+gabc123"), None);
assert_eq!(skew_direction("0.12.0+gabc123-dirty", "0.12.0"), None);
assert_eq!(
skew_direction("0.12.0-rc.1", "0.12.0"),
Some(SkewDirection::StampedOlder)
);
assert_eq!(skew_direction("not-a-version", "0.12.0"), None);
assert_eq!(skew_direction("0.12.0", ""), None);
}
}