semver_common/tools/git/
get_commits.rs1use crate::{Alert, Commit, run_command};
2use r_log::Logger;
3
4pub 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}