pub(crate) fn describe_version(
pkg: &str,
exact_tag: bool,
short_hash: Option<&str>,
dirty: bool,
) -> String {
match short_hash {
None => pkg.to_string(),
Some(_) if exact_tag && !dirty => pkg.to_string(),
Some(hash) => {
let mut version = format!("{pkg}+g{hash}");
if dirty {
version.push_str(".dirty");
}
version
},
}
}
pub(crate) fn ci_release_tag(ref_type: Option<&str>, ref_name: Option<&str>, pkg: &str) -> bool {
ref_type == Some("tag") && ref_name == Some(format!("v{pkg}").as_str())
}
#[cfg(test)]
mod tests {
use super::{ci_release_tag, describe_version};
#[test]
fn pristine_release_tag_reads_plain() {
assert_eq!(describe_version("0.16.0", true, Some("abc1234"), false), "0.16.0");
}
#[test]
fn no_git_reads_plain() {
assert_eq!(describe_version("0.16.0", false, None, false), "0.16.0");
}
#[test]
fn off_tag_gets_a_hash_suffix() {
assert_eq!(describe_version("0.16.0", false, Some("abc1234"), false), "0.16.0+gabc1234");
}
#[test]
fn uncommitted_tree_is_marked_dirty() {
assert_eq!(
describe_version("0.16.0", false, Some("abc1234"), true),
"0.16.0+gabc1234.dirty"
);
}
#[test]
fn a_dirty_tree_even_at_a_tag_is_not_a_pristine_release() {
assert_eq!(
describe_version("0.16.0", true, Some("abc1234"), true),
"0.16.0+gabc1234.dirty"
);
}
#[test]
fn ci_tag_ref_matching_pkg_is_a_release() {
assert!(ci_release_tag(Some("tag"), Some("v0.16.0"), "0.16.0"));
}
#[test]
fn ci_branch_ref_is_not_a_release() {
assert!(!ci_release_tag(Some("branch"), Some("main"), "0.16.0"));
}
#[test]
fn ci_tag_ref_for_a_different_version_is_not_this_release() {
assert!(!ci_release_tag(Some("tag"), Some("v0.15.0"), "0.16.0"));
}
#[test]
fn no_ci_env_is_not_a_release() {
assert!(!ci_release_tag(None, None, "0.16.0"));
}
}