aboutsummaryrefslogtreecommitdiffstats
path: root/xtask/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'xtask/src/main.rs')
-rw-r--r--xtask/src/main.rs57
1 files changed, 54 insertions, 3 deletions
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index ebdeecb..76fca16 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -11,12 +11,14 @@ use std::{fs::File, process::Command};
use anyhow::{anyhow, bail, ensure, Context, Result};
use build_info::BuildInfo;
+use bump::{Bump, Level};
use clap::{Parser, Subcommand};
use flate2::{write::GzEncoder, Compression};
use once_cell::sync::Lazy;
+use semver::Version;
use tar::Builder;
-mod release;
+mod bump;
const PKG_NAME: &str = "projectr";
const PKG_VER: &str = env!("CARGO_PKG_VERSION");
@@ -41,7 +43,20 @@ fn main() -> Result<()> {
let targz = generate_tar_gz(version)?;
println!("{}", targz.display());
}
- Commands::Release(release) => release.run()?,
+ Commands::Release { level } => {
+ let Bump { prev, next } = release(level, cli.pre_release)?;
+
+ println!("Bumped version: {prev} -> {next}");
+ println!();
+ println!("Create release commit:");
+ println!("git commit -m 'chore: release projectr version {next}'");
+ println!();
+ println!("Create release tag:");
+ println!("git shortlog v{prev}..HEAD | git tag -s v{next} --file -");
+ println!();
+ println!("Push refs:");
+ println!("git push --follow-tags");
+ }
};
Ok(())
@@ -70,7 +85,11 @@ enum Commands {
Dist,
/// Automation for create a new release.
- Release(release::Release),
+ Release {
+ /// Level of version bump.
+ #[arg(required = false)]
+ level: bump::Level,
+ },
}
fn version(pre_release: bool) -> Result<String> {
@@ -162,6 +181,38 @@ fn build_binary() -> Result<PathBuf> {
Ok(binary)
}
+pub fn release(level: Level, pre_release: bool) -> Result<Bump> {
+ let prev = PKG_VER.parse().unwrap_or_else(|_| Version::new(0, 1, 0));
+ let mut next = level.bump(&prev);
+
+ if pre_release {
+ next.pre = semver::Prerelease::new("dev")?
+ }
+
+ let bump = Bump { next, prev };
+
+ 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", bump::vsc_pkgbuild)?;
+
+ let cargo_update = Command::new("cargo")
+ .arg("update")
+ .arg("--workspace")
+ .status()?;
+ anyhow::ensure!(cargo_update.success(), "Failed to update cargo lockfile");
+
+ let git_added = Command::new("git")
+ .arg("add")
+ .arg("./Cargo.lock")
+ .status()?;
+ anyhow::ensure!(git_added.success(), "Failed to add Cargo.lock to git");
+
+ Ok(bump)
+}
+
static PROJECT_ROOT: Lazy<PathBuf> = Lazy::new(|| {
let dir = std::env::current_dir().unwrap_or_else(|_| {
Path::new(env!("CARGO_MANIFEST_DIR"))