use anyhow::{bail, Context, Result};
use std::fs;
use std::path::Path;
use std::process::Command;
fn run(repo_path: &Path, args: &[&str]) -> Result<()> {
let status = Command::new("git-cliff")
.current_dir(repo_path)
.args(args)
.status()
.context("failed to run git-cliff")?;
if !status.success() {
bail!("git-cliff {:?} failed", args);
}
Ok(())
}
fn prepend_args<'a>(version: &'a str, changelog_path: &'a str) -> Vec<&'a str> {
vec!["--unreleased", "--tag", version, "--prepend", changelog_path]
}
pub fn prepend_changelog(repo_path: &Path, version: &str, changelog_path: &str) -> Result<()> {
let full_path = repo_path.join(changelog_path);
if !full_path.exists() {
fs::write(&full_path, "").with_context(|| format!("failed to create {}", full_path.display()))?;
}
run(repo_path, &prepend_args(version, changelog_path))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn prepend_args_targets_the_changelog_file() {
assert_eq!(
prepend_args("1.2.3", "CHANGELOG.md"),
vec!["--unreleased", "--tag", "1.2.3", "--prepend", "CHANGELOG.md"]
);
}
}