CreateChange: Fix appending Signed-off-by line after Change-Id

The Signed-off-by line was appended onto the existing message
without a newline. If there was already a Change-Id line in the
commit message footer, this resulted in the Change-Id being
malformed.

Bug: Issue 8299
Change-Id: I0b8084bcf27737eec3291a79504f20e697a3b187
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
index 3692aa5..993f3f5 100644
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
+++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
@@ -145,6 +145,26 @@
   }
 
   @Test
+  public void createNewChangeSignedOffByFooterWithChangeId() throws Exception {
+    setSignedOffByFooter(true);
+    try {
+      ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+      String changeId = "I1234000000000000000000000000000000000000";
+      String changeIdLine = "Change-Id: " + changeId;
+      ci.subject = "Subject\n\n" + changeIdLine;
+      ChangeInfo info = assertCreateSucceeds(ci);
+      assertThat(info.changeId).isEqualTo(changeId);
+      String message = info.revisions.get(info.currentRevision).commit.message;
+      assertThat(message).contains(changeIdLine);
+      assertThat(message).contains(
+          String.format("%sAdministrator <%s>", SIGNED_OFF_BY_TAG,
+              admin.getIdent().getEmailAddress()));
+    } finally {
+      setSignedOffByFooter(false);
+    }
+  }
+
+  @Test
   public void createNewDraftChange() throws Exception {
     assume().that(isAllowDrafts()).isTrue();
     assertCreateSucceeds(newChangeInput(ChangeStatus.DRAFT));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
index 3079441..cf4be18 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java
@@ -16,6 +16,7 @@
 
 import static org.eclipse.jgit.lib.Constants.SIGNED_OFF_BY_TAG;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
 import com.google.common.collect.Iterables;
@@ -242,9 +243,10 @@
       }
 
       if (Boolean.TRUE.equals(info.signedOffBy)) {
-        commitMessage += String.format("%s%s",
-            SIGNED_OFF_BY_TAG,
-            account.getAccount().getNameEmail(anonymousCowardName));
+        commitMessage =
+            Joiner.on("\n").join(commitMessage.trim(), String.format(
+                "%s%s", SIGNED_OFF_BY_TAG,
+                account.getAccount().getNameEmail(anonymousCowardName)));
       }
 
       RevCommit c;