From ba96710629e0d32ca4994cf7fb43519b00cd886d Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Sat, 8 Jul 2023 13:06:21 -0500 Subject: build: move bump to utility functions --- xtask/src/release/bump.rs | 102 ++++++++++++++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 36 deletions(-) (limited to 'xtask/src/release/bump.rs') diff --git a/xtask/src/release/bump.rs b/xtask/src/release/bump.rs index 76218eb..86a1c96 100644 --- a/xtask/src/release/bump.rs +++ b/xtask/src/release/bump.rs @@ -10,8 +10,6 @@ use std::{ use anyhow::Result; use semver::Version; -use crate::PKG_VER; - #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord)] pub enum Level { Major, @@ -114,31 +112,13 @@ impl Display for Bump { } } -impl Default for Bump { - fn default() -> Self { - let version = PKG_VER.parse().unwrap_or_else(|_| Version::new(0, 1, 0)); - Self { - next: Level::default().bump(&version), - version, - } - } -} - -impl From for Bump { - fn from(level: Level) -> Self { - let mut v = Self::default(); - v.next = level.bump(&v.version); - v - } -} - /// Utility function for replacing version with next in a string. pub fn replace(buf: String, Bump { version, next }: &Bump) -> Result { Ok(buf.replace(&version.to_string(), &next.to_string())) } /// Utility function for bumping the version in a Cargo.toml file. -pub fn replace_cargo(buf: String, Bump { version: _, next }: &Bump) -> Result { +pub fn cargo(buf: String, Bump { version: _, next }: &Bump) -> Result { let mut cargo_toml: toml_edit::Document = buf.parse()?; if cargo_toml["package"]["version"]["workspace"] @@ -155,20 +135,78 @@ pub fn replace_cargo(buf: String, Bump { version: _, next }: &Bump) -> Result Result { + let stdout = std::process::Command::new("git") + .arg("describe") + .arg("--long") + .arg("--abbrev=7") + .output()? + .stdout; + + let pkgver = std::str::from_utf8(&stdout)? + .trim() + .trim_start_matches('v') + .replacen("-g", ".g", 1) + .replacen('-', "-r", 1) + .replace('-', "."); + + if let Some(from) = buf.lines().find(|l| l.starts_with("pkgver=")) { + Ok(buf.replace(from, &format!("pkgver={pkgver}"))) + } else { + Ok(buf) + } +} + +pub fn changelog(buf: String, Bump { version: _, next }: &Bump) -> Result { + let date = chrono::Utc::now().format("%Y-%m-%d"); + + let lines: Vec = buf + .lines() + .flat_map(|line| { + if line.starts_with("## [Unreleased]") { + vec![ + line.to_owned(), + "".to_owned(), + format!("## [{next}] - {date}"), + ] + } else if line.starts_with("[Unreleased]: ") { + vec![ + line.to_owned(), + line.replace("[Unreleased]", &format!("[{next}]")) + .replace("HEAD", &format!("v{next}")), + ] + } else { + vec![line.to_owned()] + } + }) + .collect(); + + Ok(lines.join("\n")) +} + #[cfg(test)] mod test { use similar_asserts::SimpleDiff; + use crate::PKG_VER; + use super::*; - fn setup_test() -> Result<(), std::io::Error> { + fn setup_test() -> Result { let project_root = std::path::Path::new(&env!("CARGO_MANIFEST_DIR")) .parent() .expect("Failed to get parent directory.") .to_path_buf(); - std::env::set_current_dir(project_root) + std::env::set_current_dir(project_root)?; + + let version = PKG_VER.parse().unwrap_or_else(|_| Version::new(0, 1, 0)); + Ok(Bump { + next: Level::default().bump(&version), + version, + }) } fn print_diff(reader: &[u8], writer: &[u8]) { @@ -182,16 +220,14 @@ mod test { #[test] fn test_bump_cargo() { - setup_test().unwrap(); - - let bump = Bump::default(); + let bump = setup_test().unwrap(); let file = "Cargo.toml"; let content = std::fs::read_to_string(file).unwrap(); let reader = content.as_bytes(); let mut writer = Vec::new(); - bump.bump(reader, &mut writer, replace_cargo).unwrap(); + bump.bump(reader, &mut writer, cargo).unwrap(); println!("{file}: {bump}"); print_diff(reader, &writer) @@ -199,9 +235,7 @@ mod test { #[test] fn test_bump_changelog() { - setup_test().unwrap(); - - let bump = Bump::default(); + let bump = setup_test().unwrap(); let file = "CHANGELOG.md"; let content = std::fs::read_to_string(file).unwrap(); @@ -234,9 +268,7 @@ mod test { #[test] fn test_bump_readme() { - setup_test().unwrap(); - - let bump = Bump::default(); + let bump = setup_test().unwrap(); let file = "README.md"; let content = std::fs::read_to_string(file); @@ -251,9 +283,7 @@ mod test { #[test] fn test_bump_vsc_pkgbuild() { - setup_test().unwrap(); - - let bump = Bump::default(); + let bump = setup_test().unwrap(); let file = "pkg/archlinux/projectr-git/PKGBUILD"; let content = std::fs::read_to_string(file).unwrap(); -- cgit v1.2.3-70-g09d2