Create project during clone step execution
Move the Gerrit create project API execution to the running stage
of the clone import step of the GitHub plugin wizard.
Change-Id: I9998e1979bf7c9b6c15b1224911dae4374c126f0
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
index dde33ff..5fe6017 100644
--- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
+++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/GitCloneStep.java
@@ -16,6 +16,9 @@
import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.util.ManualRequestContext;
+import com.google.gerrit.server.util.OneOffRequestContext;
+import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.googlesource.gerrit.plugins.github.GitHubConfig;
@@ -34,7 +37,10 @@
private final File gitDir;
private final GerritApi gerritApi;
- private File destinationDirectory;
+ private final OneOffRequestContext context;
+ private final String organisation;
+ private final String repository;
+ private final File destinationDirectory;
public interface Factory {
GitCloneStep create(
@@ -46,6 +52,7 @@
GitHubConfig gitConfig,
GitHubRepository.Factory gitHubRepoFactory,
GerritApi gerritApi,
+ OneOffRequestContext context,
@Assisted("organisation") String organisation,
@Assisted("name") String repository)
throws GitException {
@@ -54,26 +61,39 @@
this.gitDir = gitConfig.gitDir.toFile();
this.gerritApi = gerritApi;
+ this.context = context;
+ this.organisation = organisation;
+ this.repository = repository;
this.destinationDirectory =
- prepareTargetGitDirectory(gerritApi, gitDir, organisation, repository);
+ prepareTargetGitDirectory(gitDir, organisation, repository);
}
- private static File prepareTargetGitDirectory(
- GerritApi gerritApi, File gitDir, String organisation, String repository)
+ private static File prepareTargetGitDirectory(File gitDir, String organisation, String repository)
throws GitException {
String projectName = organisation + "/" + repository;
- try {
+ File repositoryDir = new File(gitDir, projectName + ".git");
+ if(repositoryDir.exists()) {
+ throw new GitDestinationAlreadyExistsException(projectName);
+ }
+ return repositoryDir;
+ }
+
+ private void createNewProject() throws GitException {
+ String projectName = organisation + "/" + repository;
+ try (ManualRequestContext requestContext = context.open()) {
gerritApi.projects().create(projectName).get();
- return new File(gitDir, projectName + ".git");
} catch (ResourceConflictException e) {
throw new GitDestinationAlreadyExistsException(projectName);
} catch (RestApiException e) {
throw new GitException("Unable to create repository " + projectName, e);
+ } catch (OrmException e) {
+ throw new GitException("Unable to create request context to create a new project " + projectName, e);
}
}
@Override
- public void doImport(ProgressMonitor progress) throws GitCloneFailedException {
+ public void doImport(ProgressMonitor progress) throws GitException {
+ createNewProject();
String sourceUri = getSourceUri();
try (Git git = Git.open(destinationDirectory)) {
FetchCommand fetch = git.fetch().setRefSpecs("refs/*:refs/*").setRemote(sourceUri);