From 1d16393d0702a66974c37fb0a6ad5fa848f57692 Mon Sep 17 00:00:00 2001 From: Justin Rubek <25621857+justinrubek@users.noreply.github.com> Date: Mon, 6 May 2024 20:51:49 -0500 Subject: [PATCH] feat: determine semver version increments --- Cargo.lock | 127 ++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/app.rs | 17 ++++++- src/cli.rs | 20 +++++++- src/versioning.rs | 34 +++++++++++++ 5 files changed, 196 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2948164..b77c916 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -163,6 +163,15 @@ dependencies = [ "serde", ] +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bomper" version = "0.7.0" @@ -172,6 +181,7 @@ dependencies = [ "cargo_metadata", "cargo_toml", "clap", + "conventional_commit_parser", "figment", "gix 0.62.0", "memmap", @@ -349,6 +359,25 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +[[package]] +name = "conventional_commit_parser" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58660f9e1d5eeeeec9c33d1473ea8bba000c673a2189edaeedb4523ec7d6f7cb" +dependencies = [ + "pest", + "pest_derive", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.4.0" @@ -414,6 +443,16 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -436,6 +475,16 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dunce" version = "1.0.4" @@ -548,6 +597,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.14" @@ -2322,6 +2381,51 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -2572,6 +2676,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shell-words" version = "1.1.0" @@ -2845,6 +2960,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "uluru" version = "3.1.0" diff --git a/Cargo.toml b/Cargo.toml index 7d033ee..79efa11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ anyhow = "1.0.59" cargo-lock = "8.0.3" cargo_metadata = "0.15.3" cargo_toml = "0.15.2" +conventional_commit_parser = "0.9.4" gix = "0.62.0" memmap = "0.7.0" parking_lot = "0.12.1" diff --git a/src/app.rs b/src/app.rs index ad51741..211aa3b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -6,7 +6,7 @@ use bomper::{ cargo::CargoReplacer, search::SearchReplacer, simple::SimpleReplacer, Replacer, VersionReplacement, }, - versioning::get_latest_tag, + versioning::{determine_increment, get_latest_tag, increment_version, VersionIncrement}, }; pub struct App { @@ -33,10 +33,23 @@ impl App { } impl App { - pub fn bump(&self, _opts: &Bump) -> Result<()> { + pub fn bump(&self, opts: &Bump) -> Result<()> { let repo = gix::discover(".")?; let tag = get_latest_tag(&repo)?; + // TODO: determine commits from tag to HEAD + let commits = vec![]; + + let increment = match &opts.options.version { + Some(version) => VersionIncrement::Manual(semver::Version::parse(version)?), + None if opts.options.automatic => determine_increment(commits), + None if opts.options.major => VersionIncrement::Major, + None if opts.options.minor => VersionIncrement::Minor, + None if opts.options.patch => VersionIncrement::Patch, + _ => unreachable!(), + }; + let new_version = increment_version(tag.version, increment); + println!("New version: {}", new_version); todo!() } diff --git a/src/cli.rs b/src/cli.rs index e3e832a..9e6265b 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -34,4 +34,22 @@ pub(crate) struct RawBump { } #[derive(clap::Args, Debug)] -pub(crate) struct Bump {} +pub(crate) struct Bump { + #[clap(flatten)] + pub options: BumpOptions, +} + +#[derive(clap::Args, Debug)] +#[command(group = clap::ArgGroup::new("bump-type").required(true))] +pub(crate) struct BumpOptions { + #[arg(short, long, group = "bump-type")] + pub version: Option, + #[arg(short, long, group = "bump-type")] + pub automatic: bool, + #[arg(short = 'M', long, group = "bump-type")] + pub major: bool, + #[arg(short, long, group = "bump-type")] + pub minor: bool, + #[arg(short, long, group = "bump-type")] + pub patch: bool, +} diff --git a/src/versioning.rs b/src/versioning.rs index 568e9b3..513969d 100644 --- a/src/versioning.rs +++ b/src/versioning.rs @@ -1,4 +1,5 @@ use crate::error::{Error, Result}; +use conventional_commit_parser::commit::ConventionalCommit; #[derive(Clone, Debug, Eq)] pub struct Tag { @@ -23,6 +24,14 @@ impl PartialEq for Tag { } } +#[derive(Debug)] +pub enum VersionIncrement { + Manual(semver::Version), + Major, + Minor, + Patch, +} + pub fn get_latest_tag(repo: &gix::Repository) -> Result { // TODO: should we only look for tags that are from the current branch? // TODO: should we ignore tags that are not semver? @@ -40,3 +49,28 @@ pub fn get_latest_tag(repo: &gix::Repository) -> Result { Ok(tag) } + +pub fn determine_increment(_commits: Vec) -> VersionIncrement { + todo!() +} + +pub fn increment_version( + mut version: semver::Version, + increment: VersionIncrement, +) -> semver::Version { + match increment { + VersionIncrement::Manual(version) => version, + VersionIncrement::Major => { + version.major += 1; + version + } + VersionIncrement::Minor => { + version.minor += 1; + version + } + VersionIncrement::Patch => { + version.patch += 1; + version + } + } +}