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.rs | 51 ++++------------------- xtask/src/release/bump.rs | 102 ++++++++++++++++++++++++++++++---------------- 2 files changed, 75 insertions(+), 78 deletions(-) (limited to 'xtask') diff --git a/xtask/src/release.rs b/xtask/src/release.rs index b53c838..06f6e1e 100644 --- a/xtask/src/release.rs +++ b/xtask/src/release.rs @@ -4,6 +4,8 @@ use anyhow::Result; use clap::{Args, Subcommand}; use semver::Version; +use crate::PKG_VER; + use self::bump::{Bump, Level}; mod bump; @@ -83,52 +85,17 @@ impl Step { } pub fn bump(level: Level) -> Result { - let mut bump = Bump::from(level); + let version = PKG_VER.parse().unwrap_or_else(|_| Version::new(0, 1, 0)); + let next = level.bump(&version); + + let mut bump = Bump { next, version }; - bump.bump_file("./Cargo.toml", bump::replace_cargo)?; + bump.bump_file("./Cargo.toml", bump::cargo)?; bump.bump_file("./README.md", bump::replace)?; + bump.bump_file("./CHANGELOG.md", bump::changelog)?; bump.bump_file("./pkg/archlinux/projectr/PKGBUILD", bump::replace)?; bump.bump_file("./pkg/archlinux/projectr-bin/PKGBUILD", bump::replace)?; - bump.bump_file("./pkg/archlinux/projectr-git/PKGBUILD", |buf, _| { - 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) - } - })?; - - bump.bump_file("./CHANGELOG.md", |buf, Bump { version: _, next }| { - let date = chrono::Utc::now().format("%Y-%m-%d"); - Ok(buf - .replace( - "## [Unreleased]", - &format!( - "## [Unreleased]\n\n\ - ## [{next}] - {date}" - ), - ) - .replace( - "[Unreleased]: https://git.sr.ht/~tobyvin/projectr/log/HEAD", - &format!( - "[Unreleased]: https://git.sr.ht/~tobyvin/projectr/log/HEAD\n\ - [{next}]: https://git.sr.ht/~tobyvin/projectr/log/v{next}" - ), - )) - })?; + bump.bump_file("./pkg/archlinux/projectr-git/PKGBUILD", bump::vsc_pkgbuild)?; Ok(bump) } 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