diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt index c0abf9a7ee..cc96e816a6 100644 --- a/Documentation/dev-plugins.txt +++ b/Documentation/dev-plugins.txt @@ -401,6 +401,20 @@ is no need for a plugin to parse the `project.config` file on its own: .getBoolean("enabled", false); ---- +It is also possible to get missing configuration parameters inherited +from the parent projects: + +[source,java] +---- + @Inject + private com.google.gerrit.server.config.PluginConfigFactory cfg; + + ... + + boolean enabled = cfg.getWithInheritance(project, "helloworld") + .getBoolean("enabled", false); +---- + Project owners can edit the project configuration by fetching the `refs/meta/config` branch, editing the `project.config` file and pushing the commit back. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java index a026500a92..279bf8e991 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfig.java @@ -15,18 +15,53 @@ package com.google.gerrit.server.config; import com.google.common.base.Objects; +import com.google.common.collect.Iterables; +import com.google.gerrit.server.git.ProjectConfig; +import com.google.gerrit.server.project.ProjectState; import org.eclipse.jgit.lib.Config; +import java.util.Arrays; +import java.util.Set; + public class PluginConfig { private static final String PLUGIN = "plugin"; private final String pluginName; - private final Config cfg; + private Config cfg; + private final ProjectConfig projectConfig; public PluginConfig(String pluginName, Config cfg) { + this(pluginName, cfg, null); + } + + public PluginConfig(String pluginName, Config cfg, ProjectConfig projectConfig) { this.pluginName = pluginName; this.cfg = cfg; + this.projectConfig = projectConfig; + } + + PluginConfig withInheritance(ProjectState.Factory projectStateFactory) { + if (projectConfig == null) { + return this; + } + + ProjectState state = projectStateFactory.create(projectConfig); + ProjectState parent = Iterables.getFirst(state.parents(), null); + if (parent != null) { + PluginConfig parentPluginConfig = + parent.getConfig().getPluginConfig(pluginName) + .withInheritance(projectStateFactory); + Set allNames = cfg.getNames(PLUGIN, pluginName); + cfg = new Config(cfg); + for (String name : parentPluginConfig.cfg.getNames(PLUGIN, pluginName)) { + if (!allNames.contains(name)) { + cfg.setStringList(PLUGIN, pluginName, name, Arrays + .asList(parentPluginConfig.cfg.getStringList(PLUGIN, pluginName, name))); + } + } + } + return this; } public String getString(String name) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java index bc5e91429d..90b6d2f649 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/config/PluginConfigFactory.java @@ -27,11 +27,14 @@ import org.eclipse.jgit.lib.Config; public class PluginConfigFactory { private final Config cfg; private final ProjectCache projectCache; + private final ProjectState.Factory projectStateFactory; @Inject - PluginConfigFactory(@GerritServerConfig Config cfg, ProjectCache projectCache) { + PluginConfigFactory(@GerritServerConfig Config cfg, + ProjectCache projectCache, ProjectState.Factory projectStateFactory) { this.cfg = cfg; this.projectCache = projectCache; + this.projectStateFactory = projectStateFactory; } public PluginConfig get(String pluginName) { @@ -46,4 +49,9 @@ public class PluginConfigFactory { } return projectState.getConfig().getPluginConfig(pluginName); } + + public PluginConfig getWithInheritance(Project.NameKey projectName, + String pluginName) throws NoSuchProjectException { + return get(projectName, pluginName).withInheritance(projectStateFactory); + } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java index 9ee8af7950..ec61a57d14 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java @@ -707,7 +707,7 @@ public class ProjectConfig extends VersionedMetaData { pluginConfig = new Config(); pluginConfigs.put(pluginName, pluginConfig); } - return new PluginConfig(pluginName, pluginConfig); + return new PluginConfig(pluginName, pluginConfig, this); } private Map readGroupList() throws IOException {