Merge "Support to inherit project level plugin configuration"
This commit is contained in:
@@ -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.
|
||||
|
@@ -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<String> 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) {
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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<String, GroupReference> readGroupList() throws IOException {
|
||||
|
Reference in New Issue
Block a user