Flag ref-updates events creating a new ref

The creation of a new ref needs a special management
in the way it is replicated to the remote endpoints.

Store the creation into a flag of the ref-updates
in the replication queues so that can be managed
differently throughout the chain.

Change-Id: I63bcaba70c1be15535d1433406a90ef85b98b63b
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 495915d..453cbf7 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
@@ -381,7 +381,8 @@
     try {
       Optional<RevisionData> maybeRevisionData =
           revReaderProvider.get().read(project, event.objectId(), event.refName(), 0);
-      return BatchApplyObjectData.create(event.refName(), maybeRevisionData);
+      return BatchApplyObjectData.create(
+          event.refName(), maybeRevisionData, event.isDelete(), event.isCreate());
     } catch (IOException e) {
       stateLog.error(
           String.format(
@@ -820,9 +821,10 @@
         String refName,
         ObjectId objectId,
         long eventCreatedOn,
-        boolean isDelete) {
+        boolean isDelete,
+        boolean isCreate) {
       return new AutoValue_ReplicationQueue_ReferenceUpdatedEvent(
-          projectName, refName, objectId, eventCreatedOn, isDelete);
+          projectName, refName, objectId, eventCreatedOn, isDelete, isCreate);
     }
 
     static ReferenceUpdatedEvent from(RefUpdateAttribute refUpdateAttribute, long eventCreatedOn) {
@@ -831,7 +833,8 @@
           refUpdateAttribute.refName,
           ObjectId.fromString(refUpdateAttribute.newRev),
           eventCreatedOn,
-          ZEROS_OBJECTID.equals(refUpdateAttribute.newRev));
+          ZEROS_OBJECTID.equals(refUpdateAttribute.newRev),
+          ZEROS_OBJECTID.equals(refUpdateAttribute.oldRev));
     }
 
     public abstract String projectName();
@@ -843,6 +846,8 @@
     public abstract long eventCreatedOn();
 
     public abstract boolean isDelete();
+
+    public abstract boolean isCreate();
   }
 
   @FunctionalInterface
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/data/BatchApplyObjectData.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/data/BatchApplyObjectData.java
index 5b17002..95ba9a9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/data/BatchApplyObjectData.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/data/BatchApplyObjectData.java
@@ -20,9 +20,24 @@
 @AutoValue
 public abstract class BatchApplyObjectData {
 
-  public static BatchApplyObjectData create(String refName, Optional<RevisionData> revisionData)
+  public static BatchApplyObjectData create(
+      String refName, Optional<RevisionData> revisionData, boolean isDelete, boolean isCreate)
       throws IllegalArgumentException {
-    return new AutoValue_BatchApplyObjectData(refName, revisionData, false);
+    return new AutoValue_BatchApplyObjectData(refName, revisionData, isDelete, isCreate);
+  }
+
+  public static BatchApplyObjectData newDeleteRef(String refName) throws IllegalArgumentException {
+    return create(refName, Optional.empty(), true, false);
+  }
+
+  public static BatchApplyObjectData newUpdateRef(
+      String refName, Optional<RevisionData> revisionData) throws IllegalArgumentException {
+    return create(refName, revisionData, false, false);
+  }
+
+  public static BatchApplyObjectData newCreateRef(
+      String refName, Optional<RevisionData> revisionData) throws IllegalArgumentException {
+    return create(refName, revisionData, false, true);
   }
 
   public abstract String refName();
@@ -31,6 +46,8 @@
 
   public abstract boolean isDelete();
 
+  public abstract boolean isCreate();
+
   @Override
   public String toString() {
     return String.format(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClientBase.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClientBase.java
index 7f0df41..cfff177 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClientBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/client/FetchRestApiClientBase.java
@@ -624,7 +624,7 @@
 
     List<BatchApplyObjectData> batchApplyObjects = new ArrayList<>();
     batchApplyObjects.add(
-        BatchApplyObjectData.create(refName, Optional.of(createSampleRevisionData("a"))));
+        BatchApplyObjectData.newUpdateRef(refName, Optional.of(createSampleRevisionData("a"))));
 
     objectUnderTest.callBatchSendObject(
         Project.nameKey("test_repo"), batchApplyObjects, eventCreatedOn, new URIish(api));
@@ -647,8 +647,8 @@
     RevisionData revisionA = createSampleRevisionData("a");
     RevisionData revisionB = createSampleRevisionData("b");
     String refNameB = "refs/heads/b";
-    batchApplyObjects.add(BatchApplyObjectData.create(refName, Optional.of(revisionA)));
-    batchApplyObjects.add(BatchApplyObjectData.create(refNameB, Optional.of(revisionB)));
+    batchApplyObjects.add(BatchApplyObjectData.newUpdateRef(refName, Optional.of(revisionA)));
+    batchApplyObjects.add(BatchApplyObjectData.newUpdateRef(refNameB, Optional.of(revisionB)));
 
     objectUnderTest.callBatchSendObject(
         Project.nameKey("test_repo"), batchApplyObjects, eventCreatedOn, new URIish(api));