summaryrefslogtreecommitdiff
path: root/src/utils/git.rs
blob: fa01e05bb4a3c7b2a6f6b5ff1fd6f087a8520c43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use std::process::Command;

pub fn retrieve_git_version() -> Option<(usize, usize)> {
    if let Ok(git_path) = grep_cli::resolve_binary("git") {
        let cmd = Command::new(git_path).arg("--version").output().ok()?;
        parse_git_version(&cmd.stdout)
    } else {
        None
    }
}

fn parse_git_version(output: &[u8]) -> Option<(usize, usize)> {
    let mut parts = output.strip_prefix(b"git version ")?.split(|&b| b == b'.');
    let major = std::str::from_utf8(parts.next()?).ok()?.parse().ok()?;
    let minor = std::str::from_utf8(parts.next()?).ok()?.parse().ok()?;
    Some((major, minor))
}

#[cfg(test)]
mod tests {
    use super::parse_git_version;
    use rstest::rstest;

    #[rstest]
    #[case(b"git version 2.46.0", Some((2, 46)))]
    #[case(b"git version 2.39.3 (Apple Git-146)", Some((2, 39)))]
    #[case(b"", None)]
    fn test_parse_git_version(#[case] input: &[u8], #[case] expected: Option<(usize, usize)>) {
        assert_eq!(parse_git_version(input), expected);
    }
}