#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate clap;
use std::fs::{self, File};
use std::io::prelude::*;
use std::process;
use regex::Regex;
mod changelog;
mod cli;
mod commit;
mod error;
mod group;
mod version;
use crate::changelog::Changelog;
lazy_static! {
static ref REG_FROM: Regex = Regex::new("<a name=\"(.*?)\".*").unwrap();
}
const HEADER: &str = "# Changelog";
const FOOTER: &str = "_Generated by [gitmoji-changelog (rust version)](https://github.com/fabienjuif/gitmoji-changelog-rust)_";
fn main() {
let matches = cli::parse_args();
let repository = matches.value_of("path").unwrap();
eprintln!("Git repository path: {}", repository);
let get_delta = |from| {
let changelog = Changelog::from(repository, from);
match changelog.to_markdown(
matches.value_of("release"),
matches.is_present("print-authors"),
) {
Err(error) => {
eprintln!("{}", error);
process::exit(1);
}
Ok(delta) => delta,
}
};
let format = |header, delta, footer| {
if matches.is_present("delta") {
return delta;
}
format!("{}\n{}\n{}", header, delta, footer)
};
let print = |changelog: String| match matches.value_of("output") {
None => println!("{}", changelog),
Some(path) => {
let mut file = File::create(path).unwrap();
file.write_all(changelog.as_bytes()).unwrap();
}
};
match fs::read_to_string(format!("{}/CHANGELOG.md", repository)) {
Err(_) => print(format(HEADER, get_delta(None), FOOTER)),
Ok(old_changelog) => {
let mut old_changelog = old_changelog.to_string();
let last_version_index = old_changelog.find("<a name=").unwrap();
let rest = old_changelog.split_off(last_version_index);
let last_version = REG_FROM.captures(&rest).unwrap();
let last_version = last_version.get(1).map(|c| c.as_str());
print(format(&old_changelog, get_delta(last_version), &rest));
}
};
}