-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
- Loading branch information
1 parent
c29b0dc
commit d88de13
Showing
5 changed files
with
105 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
reckon-core/src/main/java/org/ajoberstar/reckon/core/CommitMessageScopeParser.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<Scope> parse(String messageBody, boolean preV1); | ||
|
||
/** | ||
* Returns a parser that checks the message subject for a prefixed like so: | ||
* {@code <scope>(<area>): 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<String, Optional<Scope>> parser) { | ||
return (messageBody, preV1) -> { | ||
return parser.apply(messageBody).map(scope -> { | ||
if (preV1 && scope == Scope.MAJOR) { | ||
return Scope.MINOR; | ||
} else { | ||
return scope; | ||
} | ||
}); | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters