Support inheritance for project specific download commands
Change-Id: Ib87fb241364af665b1ce0a8a012da58ad1de1656
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java
index 913d5ee..15052a1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/DownloadCommandUpdater.java
@@ -135,7 +135,7 @@
if (dc != null) {
dc.add(p, command);
} else {
- dc = new ProjectDownloadCommand(p, command);
+ dc = new ProjectDownloadCommand(projectCache, p, command);
projectDownloadCommands.put(name, dc);
registrationHandles.put(name,
map().put(pluginName, name.replaceAll("-", " "), provider(dc)));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java
index f3a5ee5..be3246a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/project/ProjectDownloadCommand.java
@@ -14,23 +14,29 @@
package com.googlesource.gerrit.plugins.download.command.project;
+import com.google.common.base.Strings;
import com.google.common.collect.Maps;
import com.google.gerrit.extensions.config.DownloadCommand;
import com.google.gerrit.extensions.config.DownloadScheme;
import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
import java.util.Map;
public class ProjectDownloadCommand extends DownloadCommand {
+ private final ProjectCache projectCache;
private final Map<Project.NameKey, String> commands;
- ProjectDownloadCommand(Project.NameKey project, String command) {
+ ProjectDownloadCommand(ProjectCache projectCache, Project.NameKey project,
+ String command) {
+ this.projectCache = projectCache;
this.commands = Maps.newHashMap();
add(project, command);
}
public void add(Project.NameKey project, String command) {
- commands.put(project, command);
+ commands.put(project, Strings.nullToEmpty(command));
}
public void remove(Project.NameKey project) {
@@ -43,12 +49,24 @@
@Override
public String getCommand(DownloadScheme scheme, String project, String ref) {
- String command = commands.get(new Project.NameKey(project));
+ Project.NameKey projectName = new Project.NameKey(project);
+ String command = commands.get(projectName);
+ if (command == null) {
+ ProjectState projectState = projectCache.get(projectName);
+ if (projectState != null) {
+ for (ProjectState parent : projectState.parents()) {
+ command = commands.get(parent.getProject().getNameKey());
+ if (command != null) {
+ break;
+ }
+ }
+ }
+ }
if (command != null) {
command = command.replaceAll("\\$\\{ref\\}", ref)
.replaceAll("\\$\\{url\\}", scheme.getUrl(project))
.replaceAll("\\$\\{project\\}", project);
}
- return command;
+ return Strings.emptyToNull(command);
}
}
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index b85a370..aefc166 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -1 +1,5 @@
This plugin adds support for project specific download commands.
+
+Project specific download commands that are defined on a parent project
+are inherited by the child projects. Child projects can overwrite the
+inherited download command or remove it by assigning no value to it.