Add message to change created via cherry pick

When a new change is created as a result of cherry picking, add
a message on the change:

 "Patch Set <number>: Cherry Picked from branch <name>."

Extend the acceptance test to verify that it works as expected.

Change-Id: I7d210dfa0d04d75e24d03297c36a22fd8f83ee1d
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
index 4a9a25c..a177d00 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -169,6 +169,11 @@
     origIt.next();
     assertThat(origIt.next().message).isEqualTo(expectedMessage);
 
+    assertThat((Iterable<?>)cherry.get().messages).hasSize(1);
+    Iterator<ChangeMessageInfo> cherryIt = cherry.get().messages.iterator();
+    expectedMessage = "Patch Set 1: Cherry Picked from branch master.";
+    assertThat(cherryIt.next().message).isEqualTo(expectedMessage);
+
     assertThat(cherry.get().subject).contains(in.message);
     assertThat(cherry.get().topic).isEqualTo("someTopic");
     cherry.current().review(ReviewInput.approve());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
index 6c80ea4..9606397 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java
@@ -193,14 +193,17 @@
         } else {
           // Change key not found on destination branch. We can create a new
           // change.
-          Change.Id newChange = createNewChange(git, revWalk, changeKey, project,
+          Change newChange = createNewChange(git, revWalk, changeKey, project,
               destRef, cherryPickCommit, refControl,
               identifiedUser, change.getTopic());
 
           addMessageToSourceChange(change, patch.getId(), destinationBranch,
               cherryPickCommit, identifiedUser, refControl);
 
-          return newChange;
+          addMessageToDestinationChange(newChange, change.getDest().getShortName(),
+              identifiedUser, refControl);
+
+          return newChange.getId();
         }
       } finally {
         revWalk.release();
@@ -229,7 +232,7 @@
     return change.getId();
   }
 
-  private Change.Id createNewChange(Repository git, RevWalk revWalk,
+  private Change createNewChange(Repository git, RevWalk revWalk,
       Change.Key changeKey, Project.NameKey project,
       Ref destRef, RevCommit cherryPickCommit, RefControl refControl,
       IdentifiedUser identifiedUser, String topic)
@@ -269,7 +272,7 @@
 
     ins.insert();
 
-    return change.getId();
+    return change;
   }
 
   private void addMessageToSourceChange(Change change, PatchSet.Id patchSetId,
@@ -293,4 +296,25 @@
     ChangeUpdate update = updateFactory.create(ctl, change.getCreatedOn());
     changeMessagesUtil.addChangeMessage(db.get(), update, changeMessage);
   }
+
+  private void addMessageToDestinationChange(Change change, String sourceBranch,
+      IdentifiedUser identifiedUser, RefControl refControl) throws OrmException {
+    PatchSet.Id patchSetId =
+        db.get().patchSets().get(change.currentPatchSetId()).getId();
+    ChangeMessage changeMessage = new ChangeMessage(
+        new ChangeMessage.Key(
+            patchSetId.getParentKey(), ChangeUtil.messageUUID(db.get())),
+            identifiedUser.getAccountId(), TimeUtil.nowTs(), patchSetId);
+
+    StringBuilder sb = new StringBuilder("Patch Set ")
+      .append(patchSetId.get())
+      .append(": Cherry Picked from branch ")
+      .append(sourceBranch)
+      .append(".");
+    changeMessage.setMessage(sb.toString());
+
+    ChangeControl ctl = refControl.getProjectControl().controlFor(change);
+    ChangeUpdate update = updateFactory.create(ctl, change.getCreatedOn());
+    changeMessagesUtil.addChangeMessage(db.get(), update, changeMessage);
+  }
 }