Add project initialisation during fetch REST Api call

Project initialisation should be triggered for both fetch and send
object REST Api calls.

Bug: Issue 15413
Change-Id: I3b8894995d652a692ed5c29ba5c27662e5f95037
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
index 0e4ace1..61f2a64 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueue.java
@@ -46,6 +46,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.function.Consumer;
+import org.apache.http.client.ClientProtocolException;
 import org.eclipse.jgit.errors.InvalidObjectIdException;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.transport.URIish;
@@ -232,17 +233,8 @@
           FetchRestApiClient fetchClient = fetchClientFactory.create(source);
 
           HttpResult result = fetchClient.callSendObject(project, refName, revision, uri);
-          if (!result.isSuccessful()
-              && source.isCreateMissingRepositories()
-              && result.isProjectMissing(project)) {
-            HttpResult initProjectResult = fetchClient.initProject(project, uri);
-            if (initProjectResult.isSuccessful()) {
-              result = fetchClient.callFetch(project, "refs/*", uri);
-            } else {
-              String errorMessage =
-                  initProjectResult.getMessage().map(e -> " - Error: " + e).orElse("");
-              repLog.error("Cannot create project " + project + errorMessage);
-            }
+          if (isProjectMissing(result, project) && source.isCreateMissingRepositories()) {
+            result = initProject(project, uri, fetchClient, result);
           }
           if (!result.isSuccessful()) {
             repLog.warn(
@@ -275,8 +267,10 @@
         try {
           URIish uri = new URIish(apiUrl);
           FetchRestApiClient fetchClient = fetchClientFactory.create(source);
-
           HttpResult result = fetchClient.callFetch(project, refName, uri);
+          if (isProjectMissing(result, project) && source.isCreateMissingRepositories()) {
+            result = initProject(project, uri, fetchClient, result);
+          }
           if (!result.isSuccessful()) {
             stateLog.warn(
                 String.format(
@@ -302,6 +296,23 @@
     return maxRetries == 0 || attempt < maxRetries;
   }
 
+  private Boolean isProjectMissing(HttpResult result, Project.NameKey project) {
+    return !result.isSuccessful() && result.isProjectMissing(project);
+  }
+
+  private HttpResult initProject(
+      Project.NameKey project, URIish uri, FetchRestApiClient fetchClient, HttpResult result)
+      throws IOException, ClientProtocolException {
+    HttpResult initProjectResult = fetchClient.initProject(project, uri);
+    if (initProjectResult.isSuccessful()) {
+      result = fetchClient.callFetch(project, "refs/*", uri);
+    } else {
+      String errorMessage = initProjectResult.getMessage().map(e -> " - Error: " + e).orElse("");
+      repLog.error("Cannot create project " + project + errorMessage);
+    }
+    return result;
+  }
+
   private void fireBeforeStartupEvents() {
     Set<String> eventsReplayed = new HashSet<>();
     for (ReferenceUpdatedEvent event : beforeStartupEventsQueue) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
index 78eb3f7..8402782 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/ReplicationQueueTest.java
@@ -137,7 +137,7 @@
   public void shouldNotCallInitProjectWhenReplicateNewRepositoriesNotSet() throws IOException {
     Event event = new TestEvent("refs/changes/01/1/meta");
     when(httpResult.isSuccessful()).thenReturn(false);
-
+    when(httpResult.isProjectMissing(any())).thenReturn(true);
     when(source.isCreateMissingRepositories()).thenReturn(false);
 
     objectUnderTest.start();