Avoid assumptions about number of parents of edit commit base
The rebase operation doesn't work well when the base is a root
commit, so bail in that case, as for some modification operations.
This is suboptimal but root commits are rare.
In other cases, iterate over parents instead of assuming there is one.
There are still places we assume an edit commit itself (as opposed to
its base) has a single parent. This assumption should still be safe.
Change-Id: I94f8165a77c0c2f183bd4b0d150174bfd2688ac8
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
index 7ea324f..d088698 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditModifier.java
@@ -152,6 +152,10 @@
ObjectInserter inserter = repo.newObjectInserter();
try {
RevCommit editCommit = edit.getEditCommit();
+ if (editCommit.getParentCount() == 0) {
+ throw new InvalidChangeOperationException(
+ "Rebase edit against root commit not implemented");
+ }
RevCommit mergeTip = rw.parseCommit(ObjectId.fromString(
current.getRevision().get()));
ThreeWayMerger m = MergeStrategy.RESOLVE.newMerger(repo, true);
@@ -251,6 +255,10 @@
RevCommit base = rw.parseCommit(ObjectId.fromString(
basePs.getRevision().get()));
+ if (base.getParentCount() == 0) {
+ throw new InvalidChangeOperationException(
+ "Modify edit against root commit not implemented");
+ }
ObjectId newTree = writeNewTree(op, repo, rw, inserter,
prevEdit, reader, file, content, base);
if (ObjectId.equals(newTree, prevEdit.getTree())) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
index ba50776..a9c6da0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/edit/ChangeEditUtil.java
@@ -275,7 +275,9 @@
ObjectInserter inserter, RevCommit parent, RevCommit edit)
throws IOException {
CommitBuilder mergeCommit = new CommitBuilder();
- mergeCommit.setParentIds(parent.getParent(0));
+ for (int i = 0; i < parent.getParentCount(); i++) {
+ mergeCommit.addParentId(parent.getParent(i));
+ }
mergeCommit.setAuthor(parent.getAuthorIdent());
mergeCommit.setMessage(parent.getFullMessage());
mergeCommit.setCommitter(edit.getCommitterIdent());