diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java index 6d253fd684..2742d5f93c 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java @@ -38,6 +38,7 @@ import com.google.gerrit.extensions.client.ChangeStatus; import com.google.gerrit.extensions.client.ListChangesOption; import com.google.gerrit.extensions.common.ApprovalInfo; import com.google.gerrit.extensions.common.ChangeInfo; +import com.google.gerrit.extensions.common.ChangeMessageInfo; import com.google.gerrit.extensions.common.LabelInfo; import com.google.gerrit.extensions.common.RevisionInfo; import com.google.gerrit.extensions.restapi.ResourceConflictException; @@ -125,9 +126,28 @@ public class ChangeIT extends AbstractDaemonTest { .id(r.getChangeId()) .revision(r.getCommit().name()) .submit(); - gApi.changes() - .id(r.getChangeId()) - .revert(); + ChangeInfo revertChange = + gApi.changes() + .id(r.getChangeId()) + .revert().get(); + + // expected messages on source change: + // 1. Uploaded patch set 1. + // 2. Patch Set 1: Code-Review+2 + // 3. Change has been successfully merged by Administrator + // 4. Patch Set 1: Reverted + List sourceMessages = new ArrayList<>( + gApi.changes().id(r.getChangeId()).get().messages); + assertThat(sourceMessages).hasSize(4); + String expectedMessage = String.format( + "Patch Set 1: Reverted\n\n" + + "This patchset was reverted in change: %s", + revertChange.changeId); + assertThat(sourceMessages.get(3).message).isEqualTo(expectedMessage); + + assertThat(revertChange.messages).hasSize(1); + assertThat(revertChange.messages.iterator().next().message) + .isEqualTo("Uploaded patch set 1."); } // Change is already up to date diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java index 1c4b77f13c..b76a25115c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java @@ -24,6 +24,7 @@ import com.google.gerrit.common.TimeUtil; import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.ChangeMessage; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -37,6 +38,7 @@ import com.google.gerrit.server.git.UpdateException; import com.google.gerrit.server.git.validators.CommitValidators; import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.RevertedSender; +import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.RefControl; @@ -183,6 +185,8 @@ public class ChangeUtil { private final GitReferenceUpdated gitRefUpdated; private final ChangeIndexer indexer; private final BatchUpdate.Factory updateFactory; + private final ChangeMessagesUtil changeMessagesUtil; + private final ChangeUpdate.Factory changeUpdateFactory; @Inject ChangeUtil(Provider user, @@ -193,7 +197,9 @@ public class ChangeUtil { GitRepositoryManager gitManager, GitReferenceUpdated gitRefUpdated, ChangeIndexer indexer, - BatchUpdate.Factory updateFactory) { + BatchUpdate.Factory updateFactory, + ChangeMessagesUtil changeMessagesUtil, + ChangeUpdate.Factory changeUpdateFactory) { this.user = user; this.db = db; this.queryProvider = queryProvider; @@ -203,6 +209,8 @@ public class ChangeUtil { this.gitRefUpdated = gitRefUpdated; this.indexer = indexer; this.updateFactory = updateFactory; + this.changeMessagesUtil = changeMessagesUtil; + this.changeUpdateFactory = changeUpdateFactory; } public Change.Id revert(ChangeControl ctl, PatchSet.Id patchSetId, @@ -265,12 +273,22 @@ public class ChangeUtil { ins = changeInserterFactory.create( refControl, change, revertCommit) .setValidatePolicy(CommitValidators.Policy.GERRIT); + + ChangeMessage changeMessage = new ChangeMessage( + new ChangeMessage.Key( + patchSetId.getParentKey(), ChangeUtil.messageUUID(db.get())), + user.get().getAccountId(), TimeUtil.nowTs(), patchSetId); StringBuilder msgBuf = new StringBuilder(); msgBuf.append("Patch Set ").append(patchSetId.get()).append(": Reverted"); msgBuf.append("\n\n"); msgBuf.append("This patchset was reverted in change: ") .append(change.getKey().get()); - ins.setMessage(msgBuf.toString()); + changeMessage.setMessage(msgBuf.toString()); + ChangeUpdate update = changeUpdateFactory.create(ctl, TimeUtil.nowTs()); + changeMessagesUtil.addChangeMessage(db.get(), update, changeMessage); + update.commit(); + + ins.setMessage("Uploaded patch set 1."); try (BatchUpdate bu = updateFactory.create( db.get(), change.getProject(), refControl.getUser(), change.getCreatedOn())) {