Merge branch 'stable-3.6' into stable-3.7
* stable-3.6:
Replicate first commit tree objects
Change-Id: I04dacd5967447c97aaac121e67d8758146137fdf
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReader.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReader.java
index 3f03ed6..f9882e8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReader.java
@@ -141,6 +141,7 @@
blobs = readBlobs(project, refName, git, totalRefSize, diffEntries);
} else {
walk.setRecursive(true);
+ walk.setPostOrderTraversal(true);
walk.addTree(tree);
blobs = readBlobs(project, refName, git, totalRefSize, walk);
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReaderIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReaderIT.java
index fcd9b19..a541d7e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReaderIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/RevisionReaderIT.java
@@ -27,6 +27,7 @@
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.Change.Id;
import com.google.gerrit.entities.Patch;
+import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.extensions.api.changes.ReviewInput;
import com.google.gerrit.extensions.api.changes.ReviewInput.CommentInput;
@@ -43,6 +44,9 @@
import java.io.IOException;
import java.util.List;
import java.util.Optional;
+import java.util.stream.Collectors;
+import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
+import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
@@ -89,6 +93,54 @@
}
@Test
+ public void shouldReadForcePushCommitWithoutParent() throws Exception {
+ String refName = "refs/heads/master";
+ Project.NameKey emptyProjectName =
+ createProjectOverAPI("emptyProject", project, false, /* submitType= */ null);
+ TestRepository<InMemoryRepository> emptyRepo = cloneProject(emptyProjectName);
+ PushOneCommit push =
+ pushFactory.create(
+ admin.newIdent(),
+ emptyRepo,
+ "subject1",
+ ImmutableMap.of("a/fileA.txt", "content 1", "b/fileB.txt", "content 2"));
+ push.setForce(true);
+ Result pushResult = push.to(refName);
+ pushResult.assertOkStatus();
+
+ try (Repository repo = repoManager.openRepository(emptyProjectName)) {
+ Optional<RevisionData> revisionDataOption =
+ Optional.ofNullable(repo.exactRef(refName))
+ .map(Ref::getObjectId)
+ .flatMap(
+ objId -> readRevisionFromObjectUnderTest(emptyProjectName, refName, objId, 0));
+
+ assertThat(revisionDataOption.isPresent()).isTrue();
+ RevisionData revisionData = revisionDataOption.get();
+ assertThat(revisionData.getCommitObject()).isNotNull();
+ assertThat(revisionData.getCommitObject().getType()).isEqualTo(Constants.OBJ_COMMIT);
+ assertThat(revisionData.getCommitObject().getContent()).isNotEmpty();
+
+ assertThat(revisionData.getTreeObject()).isNotNull();
+ assertThat(revisionData.getTreeObject().getType()).isEqualTo(Constants.OBJ_TREE);
+ assertThat(revisionData.getTreeObject().getContent()).isNotEmpty();
+
+ assertThat(revisionData.getBlobs()).hasSize(4);
+
+ assertThat(
+ revisionData.getBlobs().stream()
+ .filter(b -> b.getType() == Constants.OBJ_TREE)
+ .collect(Collectors.toList()))
+ .hasSize(2);
+ assertThat(
+ revisionData.getBlobs().stream()
+ .filter(b -> b.getType() == Constants.OBJ_BLOB)
+ .collect(Collectors.toList()))
+ .hasSize(2);
+ }
+ }
+
+ @Test
public void shouldReadRefMetaObjectWithMaxNumberOfParents() throws Exception {
int numberOfParents = 3;
setReplicationConfig(numberOfParents);
@@ -145,6 +197,11 @@
private Optional<RevisionData> readRevisionFromObjectUnderTest(
String refName, ObjectId objId, int maxParentsDepth) {
+ return readRevisionFromObjectUnderTest(project, refName, objId, maxParentsDepth);
+ }
+
+ private Optional<RevisionData> readRevisionFromObjectUnderTest(
+ Project.NameKey project, String refName, ObjectId objId, int maxParentsDepth) {
try {
return objectUnderTest.read(project, objId, refName, maxParentsDepth);
} catch (Exception e) {