use cbh_model::GitInfo;
#[must_use]
pub fn parse_git_info(commit: &str, branch: &str, status: &str) -> GitInfo {
GitInfo {
commit: non_empty(commit),
branch: non_empty(branch).filter(|branch| branch != "HEAD"),
dirty: !status.trim().is_empty(),
}
}
fn non_empty(value: &str) -> Option<String> {
let trimmed = value.trim();
if trimmed.is_empty() {
None
} else {
Some(trimmed.to_owned())
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn builds_clean_info() {
let info = parse_git_info("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\n", "main\n", "");
assert_eq!(
info.commit.as_deref(),
Some("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef")
);
assert_eq!(info.branch.as_deref(), Some("main"));
assert!(!info.dirty);
}
#[test]
fn detects_dirty_tree() {
let info = parse_git_info("c", "main", " M src/lib.rs\n");
assert!(info.dirty);
}
#[test]
fn detached_head_branch_is_dropped() {
let info = parse_git_info("c", "HEAD\n", "");
assert_eq!(info.branch, None);
}
#[test]
fn empty_outputs_yield_defaults() {
let info = parse_git_info("", "", "");
assert_eq!(info, GitInfo::default());
}
}