use git;
use report;
use output;
use commit;
use config;
use exitcode;
pub fn run(config: &config::Configuration, given_range: Option<Vec<String>>) -> exitcode::ExitCode {
if git::in_git_repository().is_err() {
return exitcode::NOINPUT;
}
let range = match given_range {
Some(vec) => vec,
None => {
let from = match git::last_tag() {
Ok(Some(tag)) => tag,
_ => {
warn!("No tags found, using HEAD^");
String::from("HEAD^")
}
};
let to = String::from("HEAD");
vec![format!("^{}", from), to]
}
};
info!("Using revision range {}", range.join(" "));
let hashes = git::commits_in_range(&range);
if hashes.is_err() {
error!("No commits in range. {:?}", hashes);
return exitcode::NOINPUT;
}
let mut commits = Vec::new();
for sha in hashes.unwrap() {
let message = git::get_commit_message(&sha);
if message.is_err() {
warn!("Commit {} could not be read. {:?}", sha, message);
continue;
}
let commit = commit::parse(&message.unwrap(), &config.date_format);
if config::is_interesting(config, &commit) {
commits.push(commit);
}
}
commits.sort_by(|a, b| a.time.cmp(&b.time));
let report = report::generate(config, &commits);
output::render(config, &report);
exitcode::OK
}