Skip to content

Commit 337fa7e

Browse files
authored
feat: allow using regex in commit message check (#26)
1 parent 080b8ad commit 337fa7e

File tree

9 files changed

+119
-18
lines changed

9 files changed

+119
-18
lines changed

README.adoc

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ values such as Git hash, branch name etc.
3131

3232
See https://github.com/manikmagar/git-versioner-maven-extension-examples[manikmagar/git-versioner-maven-extension-examples]
3333
for examples of using this extension.
34-
34+
3535
[#versionKeywords]
3636
== What are version keywords?
3737
*Version keywords* are the reserved words that describes which milestone of the release is this.
@@ -202,6 +202,20 @@ gv.keywords.minorKey=[SMALL]
202202
gv.keywords.patchKey=[FIX]
203203
----
204204

205+
=== Use regex for version keywords
206+
You can also use regex to match version keywords.
207+
This is useful when you want to be sure that the version keyword will only be matched when it is the first word in the commit message.
208+
So if for example you have a merge commit message which contains the messages of the merged commits, you can use a regex to match only the first commit message.
209+
210+
To use regex for version keywords, you can add following properties to `.mvn/git-versioner.extensions.properties` file -
211+
212+
.Example configuration for regex version keywords
213+
----
214+
gv.keywords.useRegex=true
215+
gv.keywords.majorKey=^\\[major\\].*
216+
gv.keywords.minorKey=^\\[minor\\].*
217+
gv.keywords.patchKey=^\\[patch\\].*
218+
----
205219

206220
== How to access generated version properties?
207221
This extension adds all version properties to *Maven properties* during build cycle -

git-versioner-maven-core/src/main/java/com/github/manikmagar/maven/versioner/core/git/JGitVersioner.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ public VersionStrategy version() {
3535
.collect(Collectors.toList());
3636
Collections.reverse(revCommits);
3737
for (RevCommit commit : revCommits) {
38-
if (commit.getFullMessage().contains(versionConfig.getKeywords().getMajorKey())) {
38+
if (hasValue(commit.getFullMessage(), versionConfig.getKeywords().getMajorKey())) {
3939
versionStrategy.increment(VersionComponentType.MAJOR, hash);
40-
} else if (commit.getFullMessage().contains(versionConfig.getKeywords().getMinorKey())) {
40+
} else if (hasValue(commit.getFullMessage(), versionConfig.getKeywords().getMinorKey())) {
4141
versionStrategy.increment(VersionComponentType.MINOR, hash);
42-
} else if (commit.getFullMessage().contains(versionConfig.getKeywords().getPatchKey())) {
42+
} else if (hasValue(commit.getFullMessage(),versionConfig.getKeywords().getPatchKey())) {
4343
versionStrategy.increment(VersionComponentType.PATCH, hash);
4444
} else {
4545
versionStrategy.increment(VersionComponentType.COMMIT, hash);
@@ -48,4 +48,12 @@ public VersionStrategy version() {
4848
return versionStrategy;
4949
});
5050
}
51+
52+
boolean hasValue(String commitMessage, String keyword) {
53+
if(versionConfig.getKeywords().isUseRegex()){
54+
return commitMessage.matches(keyword);
55+
}else {
56+
return commitMessage.contains(keyword);
57+
}
58+
}
5159
}

git-versioner-maven-core/src/main/java/com/github/manikmagar/maven/versioner/core/params/VersionKeywords.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public final class VersionKeywords {
1313
public static final String GV_KEYWORDS_MAJOR_KEY = "gv.keywords.majorKey";
1414
public static final String GV_KEYWORDS_MINOR_KEY = "gv.keywords.minorKey";
1515
public static final String GV_KEYWORDS_PATCH_KEY = "gv.keywords.patchKey";
16+
public static final String GV_KEYWORDS_KEY_USEREGEX = "gv.keywords.useRegex";
1617

1718
/**
1819
* The keyword for calculating major version of the SemVer.
@@ -26,11 +27,16 @@ public final class VersionKeywords {
2627
* The keyword for calculating patch version of the SemVer.
2728
*/
2829
private String patchKey = KEY_PATCH;
30+
/**
31+
* Whether to use regex for matching keywords.
32+
*/
33+
private boolean useRegex = false;
2934

30-
public VersionKeywords(String majorKey, String minorKey, String patchKey) {
35+
public VersionKeywords(String majorKey, String minorKey, String patchKey, boolean useRegex) {
3136
setMajorKey(majorKey);
3237
setMinorKey(minorKey);
3338
setPatchKey(patchKey);
39+
setUseRegex(useRegex);
3440
}
3541
public VersionKeywords() {
3642

@@ -72,6 +78,14 @@ public void setPatchKey(String patchKey) {
7278
}
7379
}
7480

81+
public void setUseRegex(boolean useRegex) {
82+
this.useRegex = useRegex;
83+
}
84+
85+
public boolean isUseRegex() {
86+
return useRegex;
87+
}
88+
7589
@Override
7690
public boolean equals(Object o) {
7791
if (this == o)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.github.manikmagar.maven.versioner.core.git;
2+
3+
import com.github.manikmagar.maven.versioner.core.params.VersionConfig;
4+
import junitparams.JUnitParamsRunner;
5+
import junitparams.Parameters;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
@RunWith(JUnitParamsRunner.class)
12+
public class JGitVersionerTest {
13+
private VersionConfig versionConfig = new VersionConfig();;
14+
private JGitVersioner jGitVersioner = new JGitVersioner(versionConfig);
15+
16+
@Test
17+
@Parameters(value = {
18+
"Fix: [minor] corrected typo, .*\\[minor\\].*, true",
19+
"[minor] Fix: corrected typo, ^\\[minor\\].*, true",
20+
"Fix: [minor] corrected typo, ^\\[minor\\].*, false",
21+
"Update: improved performance, [minor], false"})
22+
public void testHasValueWithRegex(String commitMessage, String keyword, boolean expected) {
23+
versionConfig.getKeywords().setUseRegex(true);
24+
25+
assertThat(jGitVersioner.hasValue(commitMessage, keyword)).isEqualTo(expected);
26+
}
27+
28+
@Test
29+
public void testHasValueWithoutRegex() {
30+
versionConfig.getKeywords().setUseRegex(false);
31+
32+
String commitMessage = "Fix: [minor] corrected typo";
33+
assertThat(jGitVersioner.hasValue(commitMessage, "[minor]")).isTrue();
34+
35+
commitMessage = "Update: improved performance";
36+
assertThat(jGitVersioner.hasValue(commitMessage, "[minor]")).isFalse();
37+
}
38+
}

git-versioner-maven-core/src/test/java/com/github/manikmagar/maven/versioner/plugin/mojo/params/VersionConfigTest.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,17 @@ public void setKeywords() {
3636
VersionKeywords versionKeywords = new VersionKeywords();
3737
versionKeywords.setMajorKey("[TEST]");
3838
versionConfig.setKeywords(versionKeywords);
39-
assertThat(versionConfig.getKeywords()).extracting("majorKey", "minorKey", "patchKey").containsExactly("[TEST]",
40-
KEY_MINOR, KEY_PATCH);
39+
assertThat(versionConfig.getKeywords()).extracting("majorKey", "minorKey", "patchKey", "useRegex").containsExactly("[TEST]",
40+
KEY_MINOR, KEY_PATCH, false);
4141
}
42-
}
42+
43+
@Test
44+
public void setUseRegEx() {
45+
VersionConfig versionConfig = new VersionConfig();
46+
VersionKeywords versionKeywords = new VersionKeywords();
47+
versionKeywords.setUseRegex(true);
48+
versionConfig.setKeywords(versionKeywords);
49+
assertThat(versionConfig.getKeywords()).extracting("majorKey", "minorKey", "patchKey", "useRegex").containsExactly(KEY_MAJOR,
50+
KEY_MINOR, KEY_PATCH, true);
51+
}
52+
}

git-versioner-maven-core/src/test/java/com/github/manikmagar/maven/versioner/plugin/mojo/params/VersionKeywordsTest.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class VersionKeywordsTest {
1515

1616
@Test
1717
public void defaultKeywords() {
18-
assertThat(new VersionKeywords()).extracting("majorKey", "minorKey", "patchKey").containsExactly(KEY_MAJOR,
19-
KEY_MINOR, KEY_PATCH);
18+
assertThat(new VersionKeywords()).extracting("majorKey", "minorKey", "patchKey","useRegex").containsExactly(KEY_MAJOR,
19+
KEY_MINOR, KEY_PATCH, false);
2020
}
2121

2222
@Test
@@ -43,4 +43,11 @@ public void setPatchKey(String key, String expected, String keyType) {
4343
assertThat(versionKeywords.getPatchKey()).as(keyType).isEqualTo(expected);
4444
}
4545

46+
@Test
47+
@Parameters(value = {"true", "false"})
48+
public void setUseRegex(boolean useRegex) {
49+
var versionKeywords = new VersionKeywords();
50+
versionKeywords.setUseRegex(useRegex);
51+
assertThat(versionKeywords.isUseRegex()).isEqualTo(useRegex);
52+
}
4653
}

git-versioner-maven-extension/src/main/java/com/github/manikmagar/maven/versioner/extension/GitVersionerModelProcessor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,10 @@ private void addPluginConfiguration(Plugin plugin) {
187187
String config = String.format(
188188
"<configuration> <versionConfig> <keywords> <majorKey>%s</majorKey>"
189189
+ " <minorKey>%s</minorKey> <patchKey>%s</patchKey>"
190+
+ " <useRegex>%s</useRegex>"
190191
+ " </keywords> </versionConfig></configuration>",
191192
versionConfig.getKeywords().getMajorKey(), versionConfig.getKeywords().getMinorKey(),
192-
versionConfig.getKeywords().getPatchKey());
193+
versionConfig.getKeywords().getPatchKey(), versionConfig.getKeywords().isUseRegex());
193194
try {
194195
Xpp3Dom configDom = Xpp3DomBuilder.build(new StringReader(config));
195196
plugin.setConfiguration(configDom);
@@ -211,6 +212,7 @@ private VersionConfig loadConfig() {
211212
keywords.setMajorKey(properties.getProperty(VersionKeywords.GV_KEYWORDS_MAJOR_KEY));
212213
keywords.setMinorKey(properties.getProperty(VersionKeywords.GV_KEYWORDS_MINOR_KEY));
213214
keywords.setPatchKey(properties.getProperty(VersionKeywords.GV_KEYWORDS_PATCH_KEY));
215+
keywords.setUseRegex(properties.getProperty(VersionKeywords.GV_KEYWORDS_KEY_USEREGEX,"false").equals("true"));
214216
coreVersionConfig.setKeywords(keywords);
215217

216218
VersionPattern versionPattern = new VersionPattern();

git-versioner-maven-plugin/src/main/java/com/github/manikmagar/maven/versioner/plugin/mojo/params/VersionKeywordsParam.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@ public final class VersionKeywordsParam {
2929
@Parameter(name = "patchKey", defaultValue = KEY_PATCH, property = GV_KEYWORDS_PATCH_KEY)
3030
private String patchKey = KEY_PATCH;
3131

32-
public VersionKeywordsParam(String majorKey, String minorKey, String patchKey) {
32+
@Parameter(name = "useRegex", defaultValue = "false", property = GV_KEYWORDS_KEY_USEREGEX)
33+
private boolean useRegex = false;
34+
35+
public VersionKeywordsParam(String majorKey, String minorKey, String patchKey, boolean useRegex) {
3336
this.majorKey = majorKey;
3437
this.minorKey = minorKey;
3538
this.patchKey = patchKey;
39+
this.useRegex = useRegex;
3640
}
3741

3842
public VersionKeywordsParam() {
@@ -51,8 +55,12 @@ public String getPatchKey() {
5155
return patchKey;
5256
}
5357

58+
public boolean isUseRegex() {
59+
return useRegex;
60+
}
61+
5462
public VersionKeywords toVersionKeywords() {
55-
return new VersionKeywords(getMajorKey(), getMinorKey(), getPatchKey());
63+
return new VersionKeywords(getMajorKey(), getMinorKey(), getPatchKey(), isUseRegex());
5664
}
5765
@Override
5866
public boolean equals(Object o) {
@@ -62,7 +70,7 @@ public boolean equals(Object o) {
6270
return false;
6371
VersionKeywordsParam that = (VersionKeywordsParam) o;
6472
return getMajorKey().equals(that.getMajorKey()) && getMinorKey().equals(that.getMinorKey())
65-
&& getPatchKey().equals(that.getPatchKey());
73+
&& getPatchKey().equals(that.getPatchKey()) && isUseRegex() == that.isUseRegex();
6674
}
6775

6876
@Override

git-versioner-maven-plugin/src/test/java/com/github/manikmagar/maven/versioner/plugin/mojo/params/VersionKeywordsParamTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class VersionKeywordsParamTest {
99

1010
@Test
1111
public void newVersionKeywords() {
12-
assertThat(new VersionKeywords("[big]", "[medium]", "[small]")).extracting("majorKey", "minorKey", "patchKey")
12+
assertThat(new VersionKeywords("[big]", "[medium]", "[small]", false)).extracting("majorKey", "minorKey", "patchKey")
1313
.containsExactly("[big]", "[medium]", "[small]");
1414
}
1515

@@ -20,8 +20,8 @@ public void toDefaultVersionKeywords() {
2020
}
2121
@Test
2222
public void toCustomVersionKeywords() {
23-
assertThat(new VersionKeywordsParam("[big]", "[medium]", "[small]"))
23+
assertThat(new VersionKeywordsParam("[big]", "[medium]", "[small]", false))
2424
.extracting(VersionKeywordsParam::toVersionKeywords)
25-
.isEqualTo(new VersionKeywords("[big]", "[medium]", "[small]"));
25+
.isEqualTo(new VersionKeywords("[big]", "[medium]", "[small]", false));
2626
}
27-
}
27+
}

0 commit comments

Comments
 (0)