summaryrefslogtreecommitdiffstats
path: root/xtask/src/release
diff options
context:
space:
mode:
Diffstat (limited to 'xtask/src/release')
-rw-r--r--xtask/src/release/bump.rs102
1 files changed, 66 insertions, 36 deletions
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();