From d88de13203f3e75bad0ba8f6a90b0dc23f62eec6 Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Sat, 23 Nov 2024 18:59:06 -0600 Subject: [PATCH 1/5] minor: Allow commit messages to bump to 1.0.0 As reported in #204, I had unfortunately forced the preference to not allow commit messages to bump to v1 on all users of commit message scope calculators. In theory, I had meant to allow custom parsing, but the custom parsing still enforced the pre-1.0 special casing. The new approach implements a new ofCommitMessageParser() mechanism that has the parsing function accept both the commit message and a boolean indicating whether the project is pre-v1.0.0. This allows the user full control of the approach they want to use. To simplify adoption of this new capability the default commit message parser was enhanced to allow "major!: subject" prefixes that bypass the pre-1.0.0 check, allowing a more CD style bump to 1.0.0. Fixes #204 --- README.md | 8 ++- .../reckon/core/CommitMessageScopeParser.java | 71 +++++++++++++++++++ .../reckon/core/ScopeCalculator.java | 45 ++++++------ .../reckon/core/ScopeCalculatorTest.java | 3 + .../reckon/gradle/ReckonExtension.java | 4 ++ 5 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 reckon-core/src/main/java/org/ajoberstar/reckon/core/CommitMessageScopeParser.java diff --git a/README.md b/README.md index 624f516..fbcd95c 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ The general form is: body is not used ``` -Where `` is `major`, `minor`, or `patch` (must be lowercase). +Where `` is `major`, `minor`, or `patch` (must be lowercase). `major!` is a special value of `` that can force an upgrade to 1.0.0. The `(area)` is not used for any programmatic reasons, but could be used by other tools to categorize changes. @@ -276,11 +276,13 @@ In this case we'd be looking at all commits since the last tagged final version, Before 1.0.0, SemVer doesn't really guarantee anything, but a good practice seems to be a `PATCH` increment is for bug fixes, while a `MINOR` increase can be new features or breaking changes. -In order to promote the convention of using `major: My message` for breaking changes, before 1.0.0 a `major` in a commit message will be read as `minor`. The goal is to promote you explicitly documenting breaking changes in your commit logs, while requiring the actual 1.0.0 version bump to come via an override with `-Preckon.scope=major`. +In order to promote the convention of using `major: My message` for breaking changes, before 1.0.0 a `major` in a commit message will be read as `minor`. The goal is to promote you explicitly documenting breaking changes in your commit logs. + +The bump to 1.0.0 can happen with either a `major!: My Message` or via an override with `-Preckon.scope=major`. #### DISCLAIMER this is not Convention Commits compliant -While this approach is similar to [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), it does not follow their spec, sticking to something more directly applicable to Reckon's scopes. User's can use the `calcScopeFromCommitMessages(Function>)` form if they want to implement Conventional Commits, or any other scheme themselves. +While this approach is similar to [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/), it does not follow their spec, sticking to something more directly applicable to Reckon's scopes. User's can use the `calcScopeFromCommitMessageParser(CommitMessageScopeParser)` form if they want to implement Conventional Commits, or any other scheme themselves. ### Tagging and pushing your version diff --git a/reckon-core/src/main/java/org/ajoberstar/reckon/core/CommitMessageScopeParser.java b/reckon-core/src/main/java/org/ajoberstar/reckon/core/CommitMessageScopeParser.java new file mode 100644 index 0000000..0ad9497 --- /dev/null +++ b/reckon-core/src/main/java/org/ajoberstar/reckon/core/CommitMessageScopeParser.java @@ -0,0 +1,71 @@ +package org.ajoberstar.reckon.core; + +import java.util.Optional; +import java.util.function.Function; +import java.util.regex.Pattern; + +/** + * A functional interface for parsing Git commit messages for Reckon scopes. The implementation can + * decide what convention within the message denotes each scope value. + */ +@FunctionalInterface +public interface CommitMessageScopeParser { + Optional parse(String messageBody, boolean preV1); + + /** + * Returns a parser that checks the message subject for a prefixed like so: + * {@code (): subject}. If the project is currently pre-v1, a prefix of {@code major: } + * will be downgraded to {@code minor}, unless you use {@code major!: } with an exclamation point. + * + * @return parser that reads scopes from subject prefixes + */ + static CommitMessageScopeParser subjectPrefix() { + var pattern = Pattern.compile("^(major!|major|minor|patch)(?:\\(.*?\\))?: .+"); + return (msg, preV1) -> { + var matcher = pattern.matcher(msg); + + if (!matcher.find()) { + return Optional.empty(); + } + + Scope scope; + switch (matcher.group(1)) { + // the ! forces use of major, ignoring preV1 checks + case "major!": + scope = Scope.MAJOR; + break; + // otherwise we don't allow pre-v1 to bump to major + case "major": + scope = preV1 ? Scope.MINOR : Scope.MAJOR; + break; + case "minor": + scope = Scope.MINOR; + break; + case "patch": + scope = Scope.PATCH; + break; + default: + throw new AssertionError("Unhandled scope value matched by regex: " + matcher.group("scope")); + }; + return Optional.of(scope); + }; + } + + /** + * Adapter for legacy message parsers always prevent bumping to v1. + * + * @param parser legacy parser function + * @return parser that prevents v1 bumps + */ + static CommitMessageScopeParser ofLegacy(Function> parser) { + return (messageBody, preV1) -> { + return parser.apply(messageBody).map(scope -> { + if (preV1 && scope == Scope.MAJOR) { + return Scope.MINOR; + } else { + return scope; + } + }); + }; + } +} diff --git a/reckon-core/src/main/java/org/ajoberstar/reckon/core/ScopeCalculator.java b/reckon-core/src/main/java/org/ajoberstar/reckon/core/ScopeCalculator.java index a00544a..6de4ee9 100644 --- a/reckon-core/src/main/java/org/ajoberstar/reckon/core/ScopeCalculator.java +++ b/reckon-core/src/main/java/org/ajoberstar/reckon/core/ScopeCalculator.java @@ -3,7 +3,6 @@ import java.util.Comparator; import java.util.Optional; import java.util.function.Function; -import java.util.regex.Pattern; @FunctionalInterface public interface ScopeCalculator { @@ -29,28 +28,36 @@ static ScopeCalculator ofUserString(Function> sco } /** - * Creates a scope calculator that uses the given function to parse the inventory's commit messages + * Creates a scope calculator that uses the given parser to parse the inventory's commit messages * for the presence os scope indicators. If any are found, the most significant scope is returned. * - * @param messageScope function that parses a single commit message for a scope indicator + * @param parser the chosen way to read scopes from commit messages * @return a legit scope calculator */ - static ScopeCalculator ofCommitMessage(Function> messageScope) { + static ScopeCalculator ofCommitMessageParser(CommitMessageScopeParser parser) { return inventory -> { - var scope = inventory.getCommitMessages().stream() - .map(messageScope) - .flatMap(Optional::stream) + var preV1 = inventory.getBaseNormal().compareTo(Version.valueOf("1.0.0")) < 0; + return inventory.getCommitMessages().stream() + .flatMap(msg -> parser.parse(msg, preV1).stream()) .max(Comparator.naturalOrder()); - - // if we're still below 1.0, don't let a commit message push you there - if (Optional.of(Scope.MAJOR).equals(scope) && inventory.getBaseNormal().compareTo(Version.valueOf("1.0.0")) < 0) { - return Optional.of(Scope.MINOR); - } else { - return scope; - } }; } + /** + * Creates a scope calculator that uses the given function to parse the inventory's commit messages + * for the presence os scope indicators. If any are found, the most significant scope is returned. + *
+ * Before v1, MAJOR is always ignored and MINOR is substituted. If that's not desirable, see + * {@link #ofCommitMessageParser(CommitMessageScopeParser)}. + * + * @param messageScope function that parses a single commit message for a scope indicator + * @return a legit scope calculator + */ + static ScopeCalculator ofCommitMessage(Function> messageScope) { + var parser = CommitMessageScopeParser.ofLegacy(messageScope); + return ofCommitMessageParser(parser); + } + /** * Creates a scope calculator that checks commit messages for a prefix of either: "major: ", "minor: * ", or "patch: " enforcing lower case. Any other commit messages are ignored. Conventionally, you @@ -59,14 +66,6 @@ static ScopeCalculator ofCommitMessage(Function> message * @return a legit scope calculator */ static ScopeCalculator ofCommitMessages() { - var pattern = Pattern.compile("^(major|minor|patch)(?:\\(.*?\\))?: .+"); - return ScopeCalculator.ofCommitMessage(msg -> { - var matcher = pattern.matcher(msg); - if (matcher.find()) { - return Optional.of(Scope.from(matcher.group(1))); - } else { - return Optional.empty(); - } - }); + return ScopeCalculator.ofCommitMessageParser(CommitMessageScopeParser.subjectPrefix()); } } diff --git a/reckon-core/src/test/java/org/ajoberstar/reckon/core/ScopeCalculatorTest.java b/reckon-core/src/test/java/org/ajoberstar/reckon/core/ScopeCalculatorTest.java index 51f1c9c..6b663c1 100644 --- a/reckon-core/src/test/java/org/ajoberstar/reckon/core/ScopeCalculatorTest.java +++ b/reckon-core/src/test/java/org/ajoberstar/reckon/core/ScopeCalculatorTest.java @@ -41,6 +41,9 @@ public void ofCommitMessageNoMatch() { var inventoryMultiMatchPre1 = getInventoryWithMessages(Version.valueOf("0.7.5"), "some message", "patch: some fix", "major: breaking change"); assertEquals(Optional.of(Scope.MINOR), calc.calculate(inventoryMultiMatchPre1), "Before 1.0 should find the more significant matching scope, but cap at minor"); + + var inventoryMultiMatchPre1Force = getInventoryWithMessages(Version.valueOf("0.7.5"), "some message", "major!: force to 1.0", "patch: some fix", "major: breaking change"); + assertEquals(Optional.of(Scope.MAJOR), calc.calculate(inventoryMultiMatchPre1Force), "Before 1.0, can force 1.0 using major! as a prefix"); } private VcsInventory getInventoryWithMessages(Version baseNormal, String... messages) { diff --git a/reckon-gradle/src/main/java/org/ajoberstar/reckon/gradle/ReckonExtension.java b/reckon-gradle/src/main/java/org/ajoberstar/reckon/gradle/ReckonExtension.java index dff1da5..6b29690 100644 --- a/reckon-gradle/src/main/java/org/ajoberstar/reckon/gradle/ReckonExtension.java +++ b/reckon-gradle/src/main/java/org/ajoberstar/reckon/gradle/ReckonExtension.java @@ -110,6 +110,10 @@ public ScopeCalculator calcScopeFromCommitMessages(Function Optional.ofNullable(stage.getOrNull())); } From 4c901a5a11e03ffa85f263b13d0974ccdfc729a7 Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Sat, 23 Nov 2024 19:26:48 -0600 Subject: [PATCH 2/5] chore: Prevent tests from trying to sign Set git config on test repos to avoid signing commits and tags. --- .../reckon/core/GitInventorySupplierTest.java | 7 +++++++ .../reckon/core/ReckonerIntegTest.java | 7 +++++++ .../reckon/gradle/BaseCompatTest.groovy | 2 ++ .../gradle/CompositeBuildCompatTest.groovy | 2 ++ .../org/ajoberstar/reckon/gradle/Gits.java | 18 +++++++++++++++++- .../reckon/gradle/SettingsCompatTest.groovy | 2 ++ 6 files changed, 37 insertions(+), 1 deletion(-) diff --git a/reckon-core/src/test/java/org/ajoberstar/reckon/core/GitInventorySupplierTest.java b/reckon-core/src/test/java/org/ajoberstar/reckon/core/GitInventorySupplierTest.java index d6063a4..8b31cf8 100644 --- a/reckon-core/src/test/java/org/ajoberstar/reckon/core/GitInventorySupplierTest.java +++ b/reckon-core/src/test/java/org/ajoberstar/reckon/core/GitInventorySupplierTest.java @@ -172,6 +172,13 @@ public void initRepository() throws IOException, GitAPIException { .setDirectory(repoDir.toFile()) .call(); + var config = git.getRepository().getConfig(); + config.setString("user", null, "name", "Some Person"); + config.setString("user", null, "email", "some.person@example.com"); + config.setString("commit", null, "gpgSign", "false"); + config.setString("tag", null, "gpgSign", "false"); + config.save(); + var initialBranch = git.getRepository().getBranch(); commit(); diff --git a/reckon-core/src/test/java/org/ajoberstar/reckon/core/ReckonerIntegTest.java b/reckon-core/src/test/java/org/ajoberstar/reckon/core/ReckonerIntegTest.java index 5803463..89045a8 100644 --- a/reckon-core/src/test/java/org/ajoberstar/reckon/core/ReckonerIntegTest.java +++ b/reckon-core/src/test/java/org/ajoberstar/reckon/core/ReckonerIntegTest.java @@ -56,6 +56,13 @@ public void setupRepo() throws IOException, GitAPIException { repoDir = Files.createTempDirectory("repo"); git = Git.init().setDirectory(repoDir.toFile()).call(); initialBranch = git.getRepository().getBranch(); + + var config = git.getRepository().getConfig(); + config.setString("user", null, "name", "Some Person"); + config.setString("user", null, "email", "some.person@example.com"); + config.setString("commit", null, "gpgSign", "false"); + config.setString("tag", null, "gpgSign", "false"); + config.save(); } @AfterEach diff --git a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/BaseCompatTest.groovy b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/BaseCompatTest.groovy index 8d9498f..e612fb9 100644 --- a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/BaseCompatTest.groovy +++ b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/BaseCompatTest.groovy @@ -20,6 +20,7 @@ class BaseCompatTest extends Specification { def remoteDir = new File(tempDir, 'remote') remote = Git.init().setDirectory(remoteDir).call() + Gits.resetConfig(remote); Gits.repoFile(remote, '.gitignore') << '.gradle/\nbuild/\n' Gits.repoFile(remote, 'master.txt') << 'contents here' @@ -31,6 +32,7 @@ class BaseCompatTest extends Specification { def remote2Dir = new File(tempDir, 'remote2') remote2 = Gits.clone(remote2Dir, remote) + Gits.resetConfig(remote2); } def 'if no git repo found, version is defaulted'() { diff --git a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/CompositeBuildCompatTest.groovy b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/CompositeBuildCompatTest.groovy index a3362ef..1db0926 100644 --- a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/CompositeBuildCompatTest.groovy +++ b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/CompositeBuildCompatTest.groovy @@ -21,6 +21,7 @@ class CompositeBuildCompatTest extends Specification { build2File = projectFile(project2Dir, 'build.gradle') def git1 = Git.init().setDirectory(project1Dir).call() + Gits.resetConfig(git1); projectFile(project1Dir, 'settings.gradle') << 'rootProject.name = "project1"' projectFile(project1Dir, '.gitignore') << '.gradle\nbuild\n' build1File << '''\ @@ -45,6 +46,7 @@ task printVersion { git1.close() def git2 = Git.init().setDirectory(project2Dir).call(); + Gits.resetConfig(git2); projectFile(project2Dir, 'settings.gradle') << 'rootProject.name = "project2"' projectFile(project2Dir, '.gitignore') << '.gradle\nbuild\n' build2File << '''\ diff --git a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/Gits.java b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/Gits.java index b9220f9..f03a5fc 100644 --- a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/Gits.java +++ b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/Gits.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; +import java.io.UncheckedIOException; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; @@ -14,9 +15,24 @@ public final class Gits { private static final SecureRandom random = new SecureRandom(); + public static void resetConfig(Git git) { + try { + var config = git.getRepository().getConfig(); + config.setString("user", null, "name", "Some Person"); + config.setString("user", null, "email", "some.person@example.com"); + config.setString("commit", null, "gpgSign", "false"); + config.setString("tag", null, "gpgSign", "false"); + config.save(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + public static Git clone(File dir, Git origin) throws GitAPIException { var uri = origin.getRepository().getDirectory().getAbsolutePath(); - return Git.cloneRepository().setDirectory(dir).setURI(uri).setCloneAllBranches(true).setNoCheckout(false).call(); + var git = Git.cloneRepository().setDirectory(dir).setURI(uri).setCloneAllBranches(true).setNoCheckout(false).call(); + resetConfig(git); + return git; } public static Path repoFile(Git git, String path) throws IOException { diff --git a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/SettingsCompatTest.groovy b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/SettingsCompatTest.groovy index 1f21b7e..edcc2c0 100644 --- a/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/SettingsCompatTest.groovy +++ b/reckon-gradle/src/compatTest/groovy/org/ajoberstar/reckon/gradle/SettingsCompatTest.groovy @@ -23,6 +23,7 @@ class SettingsCompatTest extends Specification { def remoteDir = new File(tempDir, 'remote') remote = Git.init().setDirectory(remoteDir).call() + Gits.resetConfig(remote); Gits.repoFile(remote, '.gitignore') << '.gradle/\nbuild/\n' Gits.repoFile(remote, 'master.txt') << 'contents here' @@ -34,6 +35,7 @@ class SettingsCompatTest extends Specification { def remote2Dir = new File(tempDir, 'remote2') remote2 = Gits.clone(remote2Dir, remote) + Gits.resetConfig(remote2); } def 'if no git repo found, version is defaulted'() { From ef80bb88c998add062cae6de9b51ff08559a0e2d Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Sat, 23 Nov 2024 19:29:31 -0600 Subject: [PATCH 3/5] chore: Test against Gradle 8.11 --- reckon-gradle/stutter.lockfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reckon-gradle/stutter.lockfile b/reckon-gradle/stutter.lockfile index 7a21e73..74b9d1b 100644 --- a/reckon-gradle/stutter.lockfile +++ b/reckon-gradle/stutter.lockfile @@ -1,4 +1,4 @@ # DO NOT MODIFY: Generated by Stutter plugin. -java11=7.0.2,7.6.4,8.0.2,8.9,8.10-rc-1 -java17=7.3.3,7.6.4,8.0.2,8.9,8.10-rc-1 -java21=8.4,8.9,8.10-rc-1 +java11=7.0.2,7.6.4,8.0.2,8.11.1 +java17=7.3.3,7.6.4,8.0.2,8.11.1 +java21=8.4,8.11.1 From 38216f7627207afdc9b622df7865c00163e426bf Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Sat, 23 Nov 2024 19:30:21 -0600 Subject: [PATCH 4/5] chore: Build against Gradle 8.11 --- gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 3990 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0..e2847c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From f68155324127694ae9cefd2c29e180f54c7c49f5 Mon Sep 17 00:00:00 2001 From: Andrew Oberstar Date: Sat, 23 Nov 2024 19:31:00 -0600 Subject: [PATCH 5/5] patch: Update dependencies --- reckon-core/gradle.lockfile | 32 ++++++++++++++++---------------- reckon-gradle/gradle.lockfile | 8 ++++---- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/reckon-core/gradle.lockfile b/reckon-core/gradle.lockfile index b672e34..80784c0 100644 --- a/reckon-core/gradle.lockfile +++ b/reckon-core/gradle.lockfile @@ -3,23 +3,23 @@ # This file is expected to be part of source control. com.github.zafarkhaja:java-semver:0.10.2=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.googlecode.javaewah:JavaEWAH:1.2.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -commons-codec:commons-codec:1.16.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy-agent:1.14.11=testCompileClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy:1.14.11=testCompileClasspath,testRuntimeClasspath -org.apache.commons:commons-lang3:3.14.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +commons-codec:commons-codec:1.17.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.15.4=testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.15.4=testCompileClasspath,testRuntimeClasspath +org.apache.commons:commons-lang3:3.17.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath -org.eclipse.jgit:org.eclipse.jgit:6.8.0.202311291450-r=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-api:5.10.2=testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-engine:5.10.2=testRuntimeClasspath -org.junit.jupiter:junit-jupiter-params:5.10.2=testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter:5.10.2=testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-commons:1.10.2=testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-engine:1.10.2=testRuntimeClasspath -org.junit.platform:junit-platform-launcher:1.10.2=testRuntimeClasspath -org.junit:junit-bom:5.10.2=testCompileClasspath,testRuntimeClasspath -org.mockito:mockito-core:5.10.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jgit:org.eclipse.jgit:6.10.0.202406032230-r=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.11.3=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.11.3=testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.11.3=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.11.3=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.11.3=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.11.3=testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.11.3=testRuntimeClasspath +org.junit:junit-bom:5.11.3=testCompileClasspath,testRuntimeClasspath +org.mockito:mockito-core:5.14.2=testCompileClasspath,testRuntimeClasspath org.objenesis:objenesis:3.3=testRuntimeClasspath org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testRuntimeClasspath -org.slf4j:slf4j-api:2.0.12=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.slf4j:slf4j-simple:2.0.12=testRuntimeClasspath +org.slf4j:slf4j-api:2.1.0-alpha1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.slf4j:slf4j-simple:2.1.0-alpha1=testRuntimeClasspath empty=annotationProcessor,signatures,testAnnotationProcessor diff --git a/reckon-gradle/gradle.lockfile b/reckon-gradle/gradle.lockfile index 9701739..a3cdbf3 100644 --- a/reckon-gradle/gradle.lockfile +++ b/reckon-gradle/gradle.lockfile @@ -3,17 +3,17 @@ # This file is expected to be part of source control. com.github.zafarkhaja:java-semver:0.10.2=runtimeClasspath,testRuntimeClasspath com.googlecode.javaewah:JavaEWAH:1.2.3=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -commons-codec:commons-codec:1.16.0=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath -org.apache.commons:commons-lang3:3.14.0=runtimeClasspath,testRuntimeClasspath +commons-codec:commons-codec:1.17.0=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.commons:commons-lang3:3.17.0=runtimeClasspath,testRuntimeClasspath org.apiguardian:apiguardian-api:1.1.2=compatTestCompileClasspath org.codehaus.groovy:groovy:3.0.12=compatTestCompileClasspath,compatTestRuntimeClasspath -org.eclipse.jgit:org.eclipse.jgit:6.8.0.202311291450-r=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jgit:org.eclipse.jgit:6.10.0.202406032230-r=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath org.hamcrest:hamcrest:2.2=compatTestCompileClasspath,compatTestRuntimeClasspath org.junit.platform:junit-platform-commons:1.9.0=compatTestCompileClasspath,compatTestRuntimeClasspath org.junit.platform:junit-platform-engine:1.9.0=compatTestCompileClasspath,compatTestRuntimeClasspath org.junit:junit-bom:5.9.0=compatTestCompileClasspath,compatTestRuntimeClasspath org.opentest4j:opentest4j:1.2.0=compatTestCompileClasspath,compatTestRuntimeClasspath org.slf4j:slf4j-api:1.7.36=compatTestCompileClasspath,compatTestRuntimeClasspath,compileClasspath,testCompileClasspath -org.slf4j:slf4j-api:2.0.12=runtimeClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:2.1.0-alpha1=runtimeClasspath,testRuntimeClasspath org.spockframework:spock-core:2.3-groovy-3.0=compatTestCompileClasspath,compatTestRuntimeClasspath empty=annotationProcessor,compatTestAnnotationProcessor,signatures,testAnnotationProcessor