Allow to specify which comment link should be used to extract issue ids
This configuration option is useful when reusing the same comment
link for different its plugins.
Change-Id: I6e32ca274c36cc56ca56e4d795229a5b35a7311c
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
index 4955f8e..2be5be8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfig.java
@@ -130,13 +130,30 @@
// Issue association --------------------------------------------------------
/**
+ * Gets the name of the comment link that should be used
+ *
+ * @return name of the comment link that should be used
+ */
+ public String getCommentLinkName() {
+ String ret;
+
+ ret = gerritConfig.getString(pluginName, null, "commentlink");
+ if (ret == null) {
+ ret = pluginName;
+ }
+
+ return ret;
+ }
+
+ /**
* Gets the regular expression used to identify issue ids.
* @return the regular expression, or {@code null}, if there is no pattern
* to match issue ids.
*/
public Pattern getIssuePattern() {
Pattern ret = null;
- String match = gerritConfig.getString("commentlink", pluginName, "match");
+ String match = gerritConfig.getString("commentlink",
+ getCommentLinkName(), "match");
if (match != null) {
ret = Pattern.compile(match);
}
@@ -148,7 +165,7 @@
* @return policy on how necessary association with issues is
*/
public ItsAssociationPolicy getItsAssociationPolicy() {
- return gerritConfig.getEnum("commentlink", pluginName, "association",
- ItsAssociationPolicy.OPTIONAL);
+ return gerritConfig.getEnum("commentlink", getCommentLinkName(),
+ "association", ItsAssociationPolicy.OPTIONAL);
}
}
diff --git a/src/main/resources/Documentation/config-common.md b/src/main/resources/Documentation/config-common.md
index 6ae1b4e..26da3ca 100644
--- a/src/main/resources/Documentation/config-common.md
+++ b/src/main/resources/Documentation/config-common.md
@@ -5,6 +5,7 @@
* [Identifying ITS ids][identifying-its-ids]
* [Enabling ITS integration][enabling-its-integration]
* [Configuring rules of when to take which actions in the ITS][configure-rules]
+* [Further common configuration details][config-common-detail]
@@ -13,7 +14,8 @@
-----------------------------------------------------
In order to extract ITS ids from commit messages, @PLUGIN@ uses
-[commentlink][upstream-comment-link-doc]s of name "`@PLUGIN@`".
+[commentlink][upstream-comment-link-doc]s of
+([per default][common-config-commentlink]) name "`@PLUGIN@`".
The first group of `commentlink.@PLUGIN@.match` is considered the
issue id.
@@ -139,6 +141,24 @@
by going to the Gerrit UI under menu Plugins -> Installed. Now you
just need to use the appropriate name to configure each plugin.
+
+
+[config-common-detail]: #config-common-detail
+<a name="config-common-detail">Further common configuration details</a>
+-----------------------------------------------------------------------
+
+[common-config-commentlink]: #common-config-commentlink
+
+<a name="common-config-commentlink">`@PLUGIN@.commentlink`
+: The name of the comment link to use to extract issue ids.
+
+ This setting is useful to reuse the same comment link from different Its
+ plugins. For example, if you set `@PLUGIN@.commentlink` to `foo`, then the
+ comment link `foo` is used (instead of the comment link `@PLUGIN@`) to
+ extract issue ids.
+
+ Default is `@PLUGIN@`
+
[Back to @PLUGIN@ documentation index][index]
[index]: index.html
diff --git a/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
index 9848c52..0417c55 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/hooks/its/ItsConfigTest.java
@@ -411,6 +411,8 @@
public void testPatternNullMatch() {
ItsConfig itsConfig = createItsConfig();
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn(null).atLeastOnce();
expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
.andReturn(null).atLeastOnce();
@@ -420,9 +422,25 @@
itsConfig.getIssuePattern());
}
+ public void testPatternNullMatchWCommentLink() {
+ ItsConfig itsConfig = createItsConfig();
+
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn("foo").atLeastOnce();
+ expect(serverConfig.getString("commentlink", "foo", "match"))
+ .andReturn(null).atLeastOnce();
+
+ replayMocks();
+
+ assertNull("Pattern for null match is not null",
+ itsConfig.getIssuePattern());
+ }
+
public void testPattern() {
ItsConfig itsConfig = createItsConfig();
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn(null).atLeastOnce();
expect(serverConfig.getString("commentlink", "ItsTestName", "match"))
.andReturn("TestPattern").atLeastOnce();
@@ -432,9 +450,26 @@
"TestPattern", itsConfig.getIssuePattern().pattern());
}
+ public void testPatternWCommentLink() {
+ ItsConfig itsConfig = createItsConfig();
+
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn("foo").atLeastOnce();
+ expect(serverConfig.getString("commentlink", "foo", "match"))
+ .andReturn("TestPattern").atLeastOnce();
+
+ replayMocks();
+
+ assertEquals("Expected and generated pattern are not equal",
+ "TestPattern", itsConfig.getIssuePattern().pattern());
+
+ }
+
public void testItsAssociationPolicyOptional() {
ItsConfig itsConfig = createItsConfig();
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn(null).atLeastOnce();
expect(serverConfig.getEnum("commentlink", "ItsTestName", "association",
ItsAssociationPolicy.OPTIONAL))
.andReturn(ItsAssociationPolicy.OPTIONAL)
@@ -446,9 +481,27 @@
ItsAssociationPolicy.OPTIONAL, itsConfig.getItsAssociationPolicy());
}
+ public void testItsAssociationPolicyOptionalWCommentLink() {
+ ItsConfig itsConfig = createItsConfig();
+
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn("foo").atLeastOnce();
+ expect(serverConfig.getEnum("commentlink", "foo", "association",
+ ItsAssociationPolicy.OPTIONAL))
+ .andReturn(ItsAssociationPolicy.OPTIONAL)
+ .atLeastOnce();
+
+ replayMocks();
+
+ assertEquals("Expected and generated associated policy do not match",
+ ItsAssociationPolicy.OPTIONAL, itsConfig.getItsAssociationPolicy());
+ }
+
public void testItsAssociationPolicySuggested() {
ItsConfig itsConfig = createItsConfig();
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn(null).atLeastOnce();
expect(serverConfig.getEnum("commentlink", "ItsTestName", "association",
ItsAssociationPolicy.OPTIONAL))
.andReturn(ItsAssociationPolicy.SUGGESTED)
@@ -460,9 +513,27 @@
ItsAssociationPolicy.SUGGESTED, itsConfig.getItsAssociationPolicy());
}
+ public void testItsAssociationPolicySuggestedWCommentLink() {
+ ItsConfig itsConfig = createItsConfig();
+
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn("foo").atLeastOnce();
+ expect(serverConfig.getEnum("commentlink", "foo", "association",
+ ItsAssociationPolicy.OPTIONAL))
+ .andReturn(ItsAssociationPolicy.SUGGESTED)
+ .atLeastOnce();
+
+ replayMocks();
+
+ assertEquals("Expected and generated associated policy do not match",
+ ItsAssociationPolicy.SUGGESTED, itsConfig.getItsAssociationPolicy());
+ }
+
public void testItsAssociationPolicyMandatory() {
ItsConfig itsConfig = createItsConfig();
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn(null).atLeastOnce();
expect(serverConfig.getEnum("commentlink", "ItsTestName", "association",
ItsAssociationPolicy.OPTIONAL))
.andReturn(ItsAssociationPolicy.MANDATORY)
@@ -474,6 +545,22 @@
ItsAssociationPolicy.MANDATORY, itsConfig.getItsAssociationPolicy());
}
+ public void testItsAssociationPolicyMandatoryWCommentLink() {
+ ItsConfig itsConfig = createItsConfig();
+
+ expect(serverConfig.getString("ItsTestName", null, "commentlink"))
+ .andReturn("foo").atLeastOnce();
+ expect(serverConfig.getEnum("commentlink", "foo", "association",
+ ItsAssociationPolicy.OPTIONAL))
+ .andReturn(ItsAssociationPolicy.MANDATORY)
+ .atLeastOnce();
+
+ replayMocks();
+
+ assertEquals("Expected and generated associated policy do not match",
+ ItsAssociationPolicy.MANDATORY, itsConfig.getItsAssociationPolicy());
+ }
+
private ItsConfig createItsConfig() {
return injector.getInstance(ItsConfig.class);
}