diff options
Diffstat (limited to 'xtask/src/main.rs')
-rw-r--r-- | xtask/src/main.rs | 57 |
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")) |