summaryrefslogtreecommitdiffstats
path: root/xtask/src
diff options
context:
space:
mode:
Diffstat (limited to 'xtask/src')
-rw-r--r--xtask/src/release.rs51
-rw-r--r--xtask/src/release/bump.rs102
2 files changed, 75 insertions, 78 deletions
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<Bump> {
- 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<Level> 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<String> {
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<String> {
+pub fn cargo(buf: String, Bump { version: _, next }: &Bump) -> Result<String> {
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<St
Ok(cargo_toml.to_string())
}
+/// Utility function for bumping the version in a VSC PKGBUILD file.
+pub fn vsc_pkgbuild(buf: String, _: &Bump) -> Result<String> {
+ 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<String> {
+ let date = chrono::Utc::now().format("%Y-%m-%d");
+
+ let lines: Vec<String> = 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<Bump, std::io::Error> {
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();