Merge "Add project initialisation during fetch REST Api call" into stable-3.3
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();