Notify listeners and update caches on project creation
We missed to notify the project creation validation listeners when a
project is created during import. Also, we missed to put the newly
created project into the project cache so it didn't appear in the
project list when the cache was already loaded.
Change-Id: I41f5552f4ad493b589185a30c15e4d886427b300
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 6965bac..f2059d0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProjectTask.java
@@ -18,6 +18,7 @@
import com.google.gerrit.common.errors.NoSuchAccountException;
import com.google.gerrit.extensions.annotations.PluginData;
+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.project.NoSuchChangeException;
@@ -106,21 +107,27 @@
} catch (IOException | GitAPIException | OrmException
| NoSuchAccountException | NoSuchChangeException | RestApiException
| ValidationException e) {
- messages.append(format("Unable to transfer project '%s' from"
- + " source gerrit host '%s': %s. Check log for details.",
- name.get(), fromGerrit, e.getMessage()));
- log.error(format("Unable to transfer project '%s' from"
- + " source gerrit host '%s'.",
- name.get(), fromGerrit), e);
+ handleError(e);
} finally {
repo.close();
}
+ } catch (ResourceConflictException e) {
+ handleError(e);
} finally {
importing.unlock();
importing.commit();
}
}
+ private void handleError(Exception e) {
+ messages.append(format("Unable to transfer project '%s' from"
+ + " source gerrit host '%s': %s. Check log for details.",
+ name.get(), fromGerrit, e.getMessage()));
+ log.error(format("Unable to transfer project '%s' from"
+ + " source gerrit host '%s'.",
+ name.get(), fromGerrit), e);
+ }
+
private LockFile lockForImport(Project.NameKey project) {
File importStatus = new File(lockRoot, project.get());
LockFile lockFile = new LockFile(importStatus, FS.DETECTED);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
index 6c09c29..dd0b390 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/OpenRepositoryStep.java
@@ -16,8 +16,14 @@
import static java.lang.String.format;
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.project.CreateProjectArgs;
+import com.google.gerrit.server.project.ProjectCache;
+import com.google.gerrit.server.validators.ProjectCreationValidationListener;
+import com.google.gerrit.server.validators.ValidationException;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -30,13 +36,21 @@
class OpenRepositoryStep {
private final GitRepositoryManager git;
+ private final ProjectCache projectCache;
+ private final DynamicSet<ProjectCreationValidationListener>
+ projectCreationValidationListeners;
@Inject
- OpenRepositoryStep(GitRepositoryManager git) {
+ OpenRepositoryStep(GitRepositoryManager git,
+ ProjectCache projectCache,
+ DynamicSet<ProjectCreationValidationListener> projectCreationValidationListeners) {
this.git = git;
+ this.projectCache = projectCache;
+ this.projectCreationValidationListeners = projectCreationValidationListeners;
}
- Repository open(Project.NameKey name, StringBuffer out) {
+ Repository open(Project.NameKey name, StringBuffer out)
+ throws ResourceConflictException {
try {
git.openRepository(name);
out.append(format("Repository %s already exists.", name.get()));
@@ -49,10 +63,30 @@
}
try {
- return git.createRepository(name);
+ beforeCreateProject(name);
+ Repository repo = git.createRepository(name);
+ onProjectCreated(name);
+ return repo;
} catch(IOException e) {
out.append(format("Error: %s, skipping project %s", e, name.get()));
return null;
}
}
+
+ private void beforeCreateProject(Project.NameKey name)
+ throws ResourceConflictException {
+ CreateProjectArgs args = new CreateProjectArgs();
+ args.setProjectName(name);
+ for (ProjectCreationValidationListener l : projectCreationValidationListeners) {
+ try {
+ l.validateNewProject(args);
+ } catch (ValidationException e) {
+ throw new ResourceConflictException(e.getMessage(), e);
+ }
+ }
+ }
+
+ private void onProjectCreated(Project.NameKey name) {
+ projectCache.onCreateProject(name);
+ }
}