Skip to main content

semver_common/tools/git/
get_commits.rs

1use crate::{Alert, Commit, run_command};
2use r_log::Logger;
3
4/// Gets the commits in the history of the supplied branch.
5/// Returns as a vector of Commit objects.
6pub fn get_commits(latest_tag: &Option<String>, logger: &Logger) -> Result<Vec<Commit>, Alert> {
7    let stdout: String = match latest_tag {
8        None => run_command("git", ["log"], Some(logger))?,
9        Some(v) => {
10            let tag_arg = format!("{}..HEAD", v);
11            run_command("git", ["log", &tag_arg], Some(logger))?
12        }
13    };
14    let mut commit_list: Vec<Commit> = vec![];
15    for c in stdout.split("\ncommit ") {
16        match Commit::new_from_commit(c.to_string()) {
17            Ok(v) => commit_list.push(v),
18            Err(_) => continue,
19        }
20    }
21    Ok(commit_list)
22}
23
24#[cfg(test)]
25mod test {
26    use super::*;
27    use crate::git::latest_tag;
28    use r_log::LogLevel;
29
30    #[test]
31    fn test_get_commits_output_all() {
32        let logger = Logger::new(LogLevel::DEBUG);
33        let commits = get_commits(&None, &logger).unwrap();
34        assert_eq!(commits.len() > 1, true);
35    }
36
37    #[test]
38    fn test_get_commits_output_since_last_tag() {
39        let logger = Logger::new(LogLevel::DEBUG);
40        let commits_all = get_commits(&None, &logger).unwrap();
41        let latest_tag = latest_tag(&logger).unwrap();
42        let commits_latest = get_commits(&Some(latest_tag), &logger).unwrap();
43        assert_eq!(commits_latest.len() < commits_all.len(), true);
44    }
45}