Configure branches for ITS integration on init
Add an init step that allows to configure the branches for which the
issue tracker system should be enabled/enforced. Admins can specify a
branch name, a ref pattern or a regular expression. By default
'refs/heads/*' is proposed which excludes the refs/meta/config branch
which is not used for product development and hence normally commits
to it don't need to contain any associations to issues. Still if
refs/meta/config should be included the ref pattern can easily be
changed to 'ref/*'.
The init step only supports the configuration of a single value for
branch. If multiple values are already configured in the
'project.config' file of the All-Projects project the init step
refuses to change the configuration as it doesn't want to overwrite
other values. In this case the init step prints out a message saying
that the branch configuration has to be done manually in the
'project.config' file of the All-Projects project.
Change-Id: Ic815b069dfa600be071f6f27d440cb043e63507b
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/its/InitIts.java b/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/its/InitIts.java
index 18df41d..da65ff8 100644
--- a/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/its/InitIts.java
+++ b/its-base/src/main/java/com/googlesource/gerrit/plugins/hooks/its/InitIts.java
@@ -14,7 +14,10 @@
package com.googlesource.gerrit.plugins.hooks.its;
+import com.google.common.base.Strings;
+import com.google.gerrit.common.data.RefConfigSection;
import com.google.gerrit.pgm.init.AllProjectsConfig;
+import com.google.gerrit.pgm.init.AllProjectsNameOnInitProvider;
import com.google.gerrit.pgm.init.InitStep;
import com.google.gerrit.pgm.init.Section;
import com.google.gerrit.pgm.util.ConsoleUI;
@@ -40,13 +43,16 @@
private final String itsDisplayName;
protected final ConsoleUI ui;
private final AllProjectsConfig allProjectsConfig;
+ private final AllProjectsNameOnInitProvider allProjects;
public InitIts(String pluginName, String itsDisplayName, ConsoleUI ui,
- AllProjectsConfig allProjectsConfig) {
+ AllProjectsConfig allProjectsConfig,
+ AllProjectsNameOnInitProvider allProjects) {
this.pluginName = pluginName;
this.itsDisplayName = itsDisplayName;
this.ui = ui;
this.allProjectsConfig = allProjectsConfig;
+ this.allProjects = allProjects;
}
@Override
@@ -74,9 +80,11 @@
switch (itsintegration) {
case ENFORCED:
cfg.setString("plugin", pluginName, "enabled", "enforced");
+ configureBranches(cfg);
break;
case ENABLED:
cfg.setBoolean("plugin", pluginName, "enabled", true);
+ configureBranches(cfg);
break;
case DISABLED:
cfg.unset("plugin", pluginName, "enabled");
@@ -88,6 +96,36 @@
allProjectsConfig.save(pluginName, "Initialize " + itsDisplayName + " Integration");
}
+ private void configureBranches(Config cfg) {
+ String[] branches = cfg.getStringList("plugin", pluginName, "branch");
+ if (branches.length > 1) {
+ ui.message("The issue tracker integration is configured for multiple branches."
+ + " Please adapt the configuration in the 'project.config' file of the '%s' project.\n",
+ allProjects.get());
+ return;
+ }
+
+ String branch = branches.length == 1 ? branches[0] : null;
+ if (Strings.isNullOrEmpty(branch)) {
+ branch = "refs/heads/*";
+ }
+
+ boolean validRef;
+ do {
+ String v = ui.readString(branch, "Branches for which the issue tracker integration"
+ + " should be enabled (ref, ref pattern or regular expression)");
+ validRef = RefConfigSection.isValid(v);
+ if (validRef) {
+ branch = v;
+ } else {
+ ui.message(
+ "'%s' is not valid. Please specify a valid ref, ref pattern or regular expression\n", v);
+ }
+ } while (!validRef);
+
+ cfg.setString("plugin", pluginName, "branch", branch);
+ }
+
public boolean isConnectivityRequested(String url) {
return ui.yesno(false, "Test connectivity to %s", url);
}