Refactor repo commands
We've had a single "repo command" stuffed in the download UI which
doesn't make a lot of sense. The command types are more about how
they mutate your local checkout, not the commands used to download.
Lets merge the repo-vs-git logic into GitDownloadCommand directly.
We create separate "getRepoCommand" and "getCommand" methods for
downstream classes to extend with the default "getRepoCommand"
defaulting to null.
Bug: Issue 11594
Change-Id: I6848c431975ec4db3aa09a160af5198b93ce5bb9
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/CheckoutCommand.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/CheckoutCommand.java
index 32ebb3d..34ca19c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/CheckoutCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/CheckoutCommand.java
@@ -35,4 +35,9 @@
String getCommand(String url, String ref) {
return "git fetch " + QuoteUtil.quote(url) + " " + ref + " && git checkout FETCH_HEAD";
}
+
+ @Override
+ String getRepoCommand(String url, String id) {
+ return "repo download " + QuoteUtil.quote(url) + " " + id;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/CherryPickCommand.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/CherryPickCommand.java
index 3aea2ee..0e964be 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/CherryPickCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/CherryPickCommand.java
@@ -35,4 +35,9 @@
String getCommand(String url, String ref) {
return "git fetch " + QuoteUtil.quote(url) + " " + ref + " && git cherry-pick FETCH_HEAD";
}
+
+ @Override
+ String getRepoCommand(String url, String id) {
+ return "repo download -c " + QuoteUtil.quote(url) + " " + id;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/DownloadCommandsModule.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/DownloadCommandsModule.java
index c2a4289..7ab47f2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/DownloadCommandsModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/DownloadCommandsModule.java
@@ -32,7 +32,5 @@
.to(FormatPatchCommand.class);
bind(DownloadCommand.class).annotatedWith(Exports.named("Pull")).to(PullCommand.class);
-
- bind(DownloadCommand.class).annotatedWith(Exports.named("repo")).to(RepoCommand.class);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/GitDownloadCommand.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/GitDownloadCommand.java
index 61bc11f..62f01a3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/GitDownloadCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/download/command/GitDownloadCommand.java
@@ -60,24 +60,27 @@
@Override
public final String getCommand(DownloadScheme scheme, String project, String ref) {
- if (commandAllowed && isRecognizedScheme(scheme)) {
+ if (commandAllowed) {
String url = scheme.getUrl(project);
- if (url != null && isValidUrl(url)) {
- if (checkForHiddenChangeRefs) {
- ref = resolveRef(project, ref);
+ if (scheme instanceof RepoScheme) {
+ String id = refToId(ref);
+ if (id != null) {
+ return getRepoCommand(url, id);
}
- if (ref != null) {
- return getCommand(url, ref);
+ } else {
+ if (url != null && isValidUrl(url)) {
+ if (checkForHiddenChangeRefs) {
+ ref = resolveRef(project, ref);
+ }
+ if (ref != null) {
+ return getCommand(url, ref);
+ }
}
}
}
return null;
}
- private static boolean isRecognizedScheme(DownloadScheme scheme) {
- return !(scheme instanceof RepoScheme);
- }
-
private static boolean isValidUrl(String url) {
try {
new URIish(url);
@@ -87,6 +90,19 @@
}
}
+ private static String refToId(String ref) {
+ if (ref.startsWith(RefNames.REFS_CHANGES)) {
+ int s1 = ref.lastIndexOf('/');
+ if (s1 > 0) {
+ int s2 = ref.lastIndexOf('/', s1 - 1);
+ if (s2 > 0) {
+ return ref.substring(s2 + 1);
+ }
+ }
+ }
+ return null;
+ }
+
private String resolveRef(String project, String ref) {
if (project.startsWith("$") || ref.startsWith("$")) {
// No real value but placeholders are being used.
@@ -119,4 +135,9 @@
}
abstract String getCommand(String url, String ref);
+
+ // Most commands don't support this, so default it to nothing.
+ String getRepoCommand(String url, String id) {
+ return null;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/download/command/RepoCommand.java b/src/main/java/com/googlesource/gerrit/plugins/download/command/RepoCommand.java
deleted file mode 100644
index 430dc7b..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/download/command/RepoCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.download.command;
-
-import com.google.gerrit.entities.RefNames;
-import com.google.gerrit.extensions.config.DownloadCommand;
-import com.google.gerrit.extensions.config.DownloadScheme;
-import com.googlesource.gerrit.plugins.download.scheme.RepoScheme;
-
-public class RepoCommand extends DownloadCommand {
- @Override
- public String getCommand(DownloadScheme scheme, String project, String ref) {
- if (scheme instanceof RepoScheme) {
- String id = trim(ref);
- if (id != null) {
- return "repo download " + QuoteUtil.quote(scheme.getUrl(project)) + " " + id;
- }
- }
- return null;
- }
-
- private static String trim(String ref) {
- if (ref.startsWith(RefNames.REFS_CHANGES)) {
- int s1 = ref.lastIndexOf('/');
- if (s1 > 0) {
- int s2 = ref.lastIndexOf('/', s1 - 1);
- if (s2 > 0) {
- return ref.substring(s2 + 1);
- }
- }
- }
- return null;
- }
-}