summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Pursehouse <dpursehouse@collab.net>2018-02-05 18:25:34 +0900
committerDavid Pursehouse <dpursehouse@collab.net>2018-02-06 13:08:58 +0900
commitc8c55e2131638509dcd8d5b8b31afea636de311a (patch)
tree526477e4ba06ea3293361cba518ad5c50b41e19f
parent6efa8fca5e592e49a90492d5f49bbc5f9a5e432c (diff)
CreateChange: Only insert Change-Id if there isn't already one
When creating a new change, the Change-Id is inserted using JGit's ChangeIdUtil. This does not detect an existing Change-Id in the subject line, resulting in the commit message having two Change-Id lines. The latter Change-Id, automatically added, is the one that is actually used. Add an extra check to detect the Change-Id in the subject line and not add another one. Bug: Issue 8284 Change-Id: Ic3c5953a86e8287c1b2228f406fdc54c2b4d914a
-rw-r--r--gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java25
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java15
2 files changed, 33 insertions, 7 deletions
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 ed0dde04b4..3692aa50d0 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
@@ -105,8 +105,29 @@ public class CreateChangeIT extends AbstractDaemonTest {
}
@Test
+ public void createEmptyChange_InvalidSubject() throws Exception {
+ ChangeInput ci = newChangeInput(ChangeStatus.NEW);
+ ci.subject = "Change-Id: I1234000000000000000000000000000000000000";
+ assertCreateFails(ci, ResourceConflictException.class,
+ "missing subject; Change-Id must be in commit message footer");
+ }
+
+ @Test
public void createNewChange() throws Exception {
- assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
+ ChangeInfo info = assertCreateSucceeds(newChangeInput(ChangeStatus.NEW));
+ assertThat(info.revisions.get(info.currentRevision).commit.message)
+ .contains("Change-Id: " + info.changeId);
+ }
+
+ @Test
+ public void createNewChangeWithChangeId() throws Exception {
+ 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);
+ assertThat(info.revisions.get(info.currentRevision).commit.message).contains(changeIdLine);
}
@Test
@@ -266,7 +287,7 @@ public class CreateChangeIT extends AbstractDaemonTest {
private ChangeInfo assertCreateSucceeds(ChangeInput in) throws Exception {
ChangeInfo out = gApi.changes().create(in).get();
assertThat(out.branch).isEqualTo(in.branch);
- assertThat(out.subject).isEqualTo(in.subject);
+ assertThat(out.subject).isEqualTo(in.subject.split("\n")[0]);
assertThat(out.topic).isEqualTo(in.topic);
assertThat(out.status).isEqualTo(in.status);
assertThat(out.revisions).hasSize(1);
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 f5ddfe5f31..3079441539 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
@@ -231,11 +231,16 @@ public class CreateChange implements
GeneralPreferencesInfo info =
account.getAccount().getGeneralPreferencesInfo();
- ObjectId treeId =
- mergeTip == null ? emptyTreeId(oi) : mergeTip.getTree();
- ObjectId id = ChangeIdUtil.computeChangeId(treeId,
- mergeTip, author, author, input.subject);
- String commitMessage = ChangeIdUtil.insertId(input.subject, id);
+ // Add a Change-Id line if there isn't already one
+ String commitMessage = input.subject;
+ if (ChangeIdUtil.indexOfChangeId(commitMessage, "\n") == -1) {
+ ObjectId treeId =
+ mergeTip == null ? emptyTreeId(oi) : mergeTip.getTree();
+ ObjectId id = ChangeIdUtil.computeChangeId(treeId,
+ mergeTip, author, author, commitMessage);
+ commitMessage = ChangeIdUtil.insertId(commitMessage, id);
+ }
+
if (Boolean.TRUE.equals(info.signedOffBy)) {
commitMessage += String.format("%s%s",
SIGNED_OFF_BY_TAG,