Check that parent project exists in target
Before importing a project check that its parent project exists in the
target system. If not, abort the import.
Change-Id: I1da1db747468103292e789ced35355c0ce774bfe
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
index c108ca0..2b35e50 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
@@ -19,11 +19,14 @@
import com.google.common.base.Charsets;
import com.google.gerrit.common.errors.NoSuchAccountException;
import com.google.gerrit.extensions.annotations.PluginData;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.OutputFormat;
import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.project.ProjectState;
import com.google.gerrit.server.validators.ValidationException;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@@ -53,6 +56,7 @@
@Assisted StringBuffer result);
}
+ private final ProjectCache projectCache;
private final OpenRepositoryStep openRepoStep;
private final ConfigureRepositoryStep configRepoStep;
private final GitFetchStep gitFetchStep;
@@ -68,7 +72,9 @@
private LockFile lockFile;
@Inject
- ImportProjectTask(OpenRepositoryStep openRepoStep,
+ ImportProjectTask(
+ ProjectCache projectCache,
+ OpenRepositoryStep openRepoStep,
ConfigureRepositoryStep configRepoStep,
GitFetchStep gitFetchStep,
ReplayChangesStep.Factory replayChangesFactory,
@@ -78,6 +84,7 @@
@Assisted("user") String user,
@Assisted("password") String password,
@Assisted StringBuffer messages) {
+ this.projectCache = projectCache;
this.openRepoStep = openRepoStep;
this.configRepoStep = configRepoStep;
this.gitFetchStep = gitFetchStep;
@@ -99,6 +106,12 @@
}
try {
+ checkPreconditions();
+ } catch (IOException | ValidationException e) {
+ handleError(e);
+ }
+
+ try {
Repository repo = openRepoStep.open(name, messages);
if (repo == null) {
return;
@@ -128,6 +141,16 @@
}
}
+ private void checkPreconditions() throws IOException, ValidationException {
+ ProjectInfo p =
+ new RemoteApi(fromGerrit, user, password).getProject(name.get());
+ ProjectState parent = projectCache.get(new Project.NameKey(p.parent));
+ if (parent == null) {
+ throw new ValidationException(format(
+ "Parent project %s does not exist in target,", p.parent));
+ }
+ }
+
static class Params {
String from;
String user;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
index 89d37d4..1125601 100755
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/RemoteApi.java
@@ -18,6 +18,7 @@
import com.google.gerrit.extensions.client.ListChangesOption;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.common.CommentInfo;
+import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.common.RevisionInfo;
import com.google.gerrit.server.OutputFormat;
import com.google.gson.Gson;
@@ -35,6 +36,14 @@
restSession = new RestSession(url, user, pass);
}
+ public ProjectInfo getProject(String projectName) throws IOException {
+ String endPoint = "/projects/" + projectName;
+ RestResponse r = restSession.get(endPoint);
+ assertOK(r);
+ return newGson().fromJson(r.getReader(),
+ new TypeToken<ProjectInfo>() {}.getType());
+ }
+
public List<ChangeInfo> queryChanges(String projectName) throws IOException {
String endPoint =
"/changes/?q=project:" + projectName +