Skip to content

Commit

Permalink
feat(monorepo): add config opt to disable global global-tag-opt
Browse files Browse the repository at this point in the history
Closes #259
  • Loading branch information
oknozor committed Feb 17, 2023
1 parent c2e7ab0 commit 2b19648
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 43 deletions.
2 changes: 1 addition & 1 deletion src/command/bump/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ impl CocoGitto {
&self,
hook_type: HookType,
current_tag: Option<&HookVersion>,
next_version: &HookVersion,
next_version: Option<&HookVersion>,
hook_profile: Option<&str>,
package_name: Option<&str>,
package: Option<&MonoRepoPackage>,
Expand Down
76 changes: 68 additions & 8 deletions src/command/bump/monorepo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use crate::{settings, CocoGitto, SETTINGS};
use anyhow::Result;
use colored::*;

use log::info;
use log::{info, warn};
use semver::Prerelease;
use tera::Tera;

Expand Down Expand Up @@ -47,7 +47,14 @@ impl CocoGitto {
) -> Result<()> {
match increment {
IncrementCommand::Auto => {
self.create_monorepo_version_auto(pre_release, hooks_config, annotated, dry_run)
if SETTINGS.generate_mono_repository_global_tag {
self.create_monorepo_version_auto(pre_release, hooks_config, annotated, dry_run)
} else {
if annotated.is_some() {
warn!("--annotated flag is not supported for package bumps without a global tag");
}
self.create_all_package_version_auto(pre_release, hooks_config, dry_run)
}
}
_ => self.create_monorepo_version_manual(
increment,
Expand All @@ -59,6 +66,59 @@ impl CocoGitto {
}
}

fn create_all_package_version_auto(
&mut self,
pre_release: Option<&str>,
hooks_config: Option<&str>,
dry_run: bool,
) -> Result<()> {
self.pre_bump_checks()?;
// Get package bumps
let bumps = self.get_packages_bumps(pre_release)?;

if dry_run {
for bump in bumps {
println!("{}", bump.new_version.prefixed_tag)
}
return Ok(());
}

let hook_result = self.run_hooks(HookType::PreBump, None, None, hooks_config, None, None);

self.repository.add_all()?;
self.unwrap_or_stash_and_exit(&Tag::default(), hook_result);
self.bump_packages(pre_release, hooks_config, &bumps)?;

let sign = self.repository.gpg_sign();
self.repository
.commit(&format!("chore(version): bump packages"), sign)?;

for bump in &bumps {
self.repository.create_tag(&bump.new_version.prefixed_tag)?;
}

// Run per package post hooks
for bump in bumps {
let package = SETTINGS
.packages
.get(&bump.package_name)
.expect("package exists");
self.run_hooks(
HookType::PostBump,
bump.old_version.as_ref(),
Some(&bump.new_version),
hooks_config,
Some(&bump.package_name),
Some(package),
)?;
}

// Run global post hooks
self.run_hooks(HookType::PostBump, None, None, hooks_config, None, None)?;

Ok(())
}

fn create_monorepo_version_auto(
&mut self,
pre_release: Option<&str>,
Expand Down Expand Up @@ -145,7 +205,7 @@ impl CocoGitto {
let hook_result = self.run_hooks(
HookType::PreBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
None,
None,
Expand Down Expand Up @@ -186,7 +246,7 @@ impl CocoGitto {
self.run_hooks(
HookType::PostBump,
bump.old_version.as_ref(),
&bump.new_version,
Some(&bump.new_version),
hooks_config,
Some(&bump.package_name),
Some(package),
Expand All @@ -197,7 +257,7 @@ impl CocoGitto {
self.run_hooks(
HookType::PostBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
None,
None,
Expand Down Expand Up @@ -269,7 +329,7 @@ impl CocoGitto {
let hook_result = self.run_hooks(
HookType::PreBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
None,
None,
Expand Down Expand Up @@ -298,7 +358,7 @@ impl CocoGitto {
self.run_hooks(
HookType::PostBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
None,
None,
Expand Down Expand Up @@ -434,7 +494,7 @@ impl CocoGitto {
let hook_result = self.run_hooks(
HookType::PreBump,
old_version.as_ref(),
&new_version,
Some(&new_version),
hooks_config,
Some(package_name),
Some(package),
Expand Down
4 changes: 2 additions & 2 deletions src/command/bump/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ impl CocoGitto {
let hook_result = self.run_hooks(
HookType::PreBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
Some(package_name),
Some(package),
Expand All @@ -91,7 +91,7 @@ impl CocoGitto {
self.run_hooks(
HookType::PostBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
Some(package_name),
Some(package),
Expand Down
4 changes: 2 additions & 2 deletions src/command/bump/standard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ impl CocoGitto {
let hook_result = self.run_hooks(
HookType::PreBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
None,
None,
Expand Down Expand Up @@ -85,7 +85,7 @@ impl CocoGitto {
self.run_hooks(
HookType::PostBump,
current.as_ref(),
&next_version,
Some(&next_version),
hooks_config,
None,
None,
Expand Down
33 changes: 17 additions & 16 deletions src/hook/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,16 @@ impl HookVersion {
impl VersionSpan {
pub(crate) fn build_version_str(
&mut self,
version: &HookVersion,
version: Option<&HookVersion>,
latest: Option<&HookVersion>,
) -> Result<String> {
let version = version.prefixed_tag.version.clone();
let version = version.map(|version| version.prefixed_tag.version.clone());
let latest = latest.map(|version| version.prefixed_tag.version.clone());

// According to the pest grammar, a `version` or `latest_version` token is expected first
let mut version = match self.tokens.pop_front() {
Some(Token::Version) => Ok(version),
Some(Token::Version) => version
.ok_or_else(|| anyhow!("No previous tag found to replace {{version}} version")),
Some(Token::LatestVersion) => {
latest.ok_or_else(|| anyhow!("No previous tag found to replace {{latest}} version"))
}
Expand Down Expand Up @@ -85,7 +86,7 @@ pub struct HookSpan {
impl HookSpan {
fn replace_versions(
&mut self,
version: &HookVersion,
version: Option<&HookVersion>,
latest: Option<&HookVersion>,
) -> Result<String> {
let mut output = self.content.clone();
Expand Down Expand Up @@ -122,7 +123,7 @@ impl Hook {
pub(crate) fn insert_versions(
&mut self,
current_version: Option<&HookVersion>,
next_version: &HookVersion,
next_version: Option<&HookVersion>,
) -> Result<()> {
let mut parts = parser::parse(&self.0)?;
self.0 = parts.replace_versions(next_version, current_version)?;
Expand Down Expand Up @@ -169,7 +170,7 @@ mod test {
#[test]
fn replace_version_cargo() -> Result<()> {
let mut hook = Hook::from_str("cargo bump {{version}}")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str()).is_equal_to("cargo bump 1.0.0");
Expand All @@ -179,7 +180,7 @@ mod test {
#[test]
fn replace_maven_version() -> Result<()> {
let mut hook = Hook::from_str("mvn versions:set -DnewVersion={{version}}")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str()).is_equal_to("mvn versions:set -DnewVersion=1.0.0");
Expand All @@ -189,7 +190,7 @@ mod test {
#[test]
fn replace_maven_version_with_expression() -> Result<()> {
let mut hook = Hook::from_str("mvn versions:set -DnewVersion={{version+1minor-SNAPSHOT}}")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str()).is_equal_to("mvn versions:set -DnewVersion=1.1.0-SNAPSHOT");
Expand All @@ -199,7 +200,7 @@ mod test {
#[test]
fn leave_hook_untouched_when_no_version() -> Result<()> {
let mut hook = Hook::from_str("echo \"Hello World\"")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str()).is_equal_to("echo \"Hello World\"");
Expand All @@ -209,7 +210,7 @@ mod test {
#[test]
fn replace_quoted_version() -> Result<()> {
let mut hook = Hook::from_str("echo \"{{version}}\"")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str()).is_equal_to("echo \"1.0.0\"");
Expand All @@ -220,7 +221,7 @@ mod test {
fn replace_version_with_nested_simple_quoted_arg() -> Result<()> {
let mut hook =
Hook::from_str("cog commit chore 'bump snapshot to {{version+1minor-pre}}'")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str()).is_equal_to("cog commit chore 'bump snapshot to 1.1.0-pre'");
Expand All @@ -231,7 +232,7 @@ mod test {
fn replace_version_with_nested_double_quoted_arg() -> Result<()> {
let mut hook =
Hook::from_str("cog commit chore \"bump snapshot to {{version+1minor-pre}}\"")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str())
Expand All @@ -244,7 +245,7 @@ mod test {
let mut hook = Hook::from_str("echo \"the latest {{latest}}, the greatest {{version}}\"")?;
hook.insert_versions(
Some(&HookVersion::new(Tag::from_str("0.5.9", None)?)),
&HookVersion::new(Tag::from_str("1.0.0", None)?),
Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)),
)
.unwrap();

Expand All @@ -259,7 +260,7 @@ mod test {
)?;
hook.insert_versions(
Some(&HookVersion::new(Tag::from_str("0.5.9", None)?)),
&HookVersion::new(Tag::from_str("1.0.0", None)?),
Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)),
)
.unwrap();

Expand All @@ -271,7 +272,7 @@ mod test {
fn replace_version_with_pre_and_build_metadata() -> Result<()> {
let mut hook =
Hook::from_str("echo \"the latest {{version+1major-pre.alpha-bravo+build.42}}\"")?;
hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

assert_that!(hook.0.as_str())
Expand All @@ -285,7 +286,7 @@ mod test {

let mut hook = Hook::from_str("git commit --allow-empty -m 'chore(snapshot): bump snapshot to {{version+1patch-SNAPSHOT}}'")?;

hook.insert_versions(None, &HookVersion::new(Tag::from_str("1.0.0", None)?))
hook.insert_versions(None, Some(&HookVersion::new(Tag::from_str("1.0.0", None)?)))
.unwrap();

let outcome = hook.run(None);
Expand Down
38 changes: 24 additions & 14 deletions src/settings/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,36 +25,46 @@ pub enum HookType {
PostBump,
}

#[derive(Debug, Deserialize, Serialize, Eq, PartialEq, Default)]
#[serde(deny_unknown_fields)]
#[derive(Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(deny_unknown_fields, default)]
pub struct Settings {
#[serde(default)]
pub from_latest_tag: bool,
#[serde(default)]
pub ignore_merge_commits: bool,
#[serde(default)]
pub generate_mono_repository_global_tag: bool,
pub monorepo_version_separator: Option<String>,
#[serde(default)]
pub branch_whitelist: Vec<String>,
pub tag_prefix: Option<String>,
#[serde(default)]
pub pre_bump_hooks: Vec<String>,
#[serde(default)]
pub post_bump_hooks: Vec<String>,
#[serde(default)]
pub pre_package_bump_hooks: Vec<String>,
#[serde(default)]
pub post_package_bump_hooks: Vec<String>,
#[serde(default)]
pub commit_types: CommitsMetadataSettings,
#[serde(default)]
pub changelog: Changelog,
#[serde(default)]
pub bump_profiles: HashMap<String, BumpProfile>,
#[serde(default)]
pub packages: HashMap<String, MonoRepoPackage>,
}

impl Default for Settings {
fn default() -> Self {
Self {
from_latest_tag: false,
ignore_merge_commits: false,
generate_mono_repository_global_tag: true,
monorepo_version_separator: None,
branch_whitelist: vec![],
tag_prefix: None,
pre_bump_hooks: vec![],
post_bump_hooks: vec![],
pre_package_bump_hooks: vec![],
post_package_bump_hooks: vec![],
commit_types: Default::default(),
changelog: Default::default(),
bump_profiles: Default::default(),
packages: Default::default(),
}
}
}

#[derive(Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(deny_unknown_fields, default)]
pub struct MonoRepoPackage {
Expand Down

0 comments on commit 2b19648

Please sign in to comment.