Merge branch 'stable-2.13'

* stable-2.13:
  Make error message for rejecting Egit placeholder Change-Id consistent
  Add tests for pushing without Change-Id and with invalid Change-Ids
  RestApiMetrics: Fix description of error count metric
  commit-msg hook: Add Change-Id after Depends-On: footer

Change-Id: I0a779290d4e750c6d30e665d12e75c5498f2c2c2
This commit is contained in:
Paladox
2017-02-02 14:33:45 +00:00
5 changed files with 95 additions and 10 deletions

View File

@@ -59,6 +59,7 @@ import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.testutil.FakeEmailSender.Message; import com.google.gerrit.testutil.FakeEmailSender.Message;
import com.google.gerrit.testutil.TestTimeUtil; import com.google.gerrit.testutil.TestTimeUtil;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.junit.TestRepository; import org.eclipse.jgit.junit.TestRepository;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
@@ -839,6 +840,72 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
assertPushRejected(pushHead(testRepo, r, false), r, "no new changes"); assertPushRejected(pushHead(testRepo, r, false), r, "no new changes");
} }
@Test
public void pushWithoutChangeId() throws Exception {
RevCommit c = createCommit(testRepo, "Message without Change-Id");
assertThat(GitUtil.getChangeId(testRepo, c).isPresent()).isFalse();
pushForReviewRejected(testRepo,
"missing Change-Id in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewOk(testRepo);
}
@Test
public void pushWithMultipleChangeIds() throws Exception {
createCommit(testRepo,
"Message with multiple Change-Id\n"
+ "\n"
+ "Change-Id: I10f98c2ef76e52e23aa23be5afeb71e40b350e86\n"
+ "Change-Id: Ie9a132e107def33bdd513b7854b50de911edba0a\n");
pushForReviewRejected(testRepo,
"multiple Change-Id lines in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewRejected(testRepo,
"multiple Change-Id lines in commit message footer");
}
@Test
public void pushWithInvalidChangeId() throws Exception {
createCommit(testRepo, "Message with invalid Change-Id\n"
+ "\n"
+ "Change-Id: X\n");
pushForReviewRejected(testRepo,
"invalid Change-Id line format in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewRejected(testRepo,
"invalid Change-Id line format in commit message footer");
}
@Test
public void pushWithInvalidChangeIdFromEgit() throws Exception {
createCommit(testRepo, "Message with invalid Change-Id\n"
+ "\n"
+ "Change-Id: I0000000000000000000000000000000000000000\n");
pushForReviewRejected(testRepo,
"invalid Change-Id line format in commit message footer");
ProjectConfig config = projectCache.checkedGet(project).getConfig();
config.getProject().setRequireChangeID(InheritableBoolean.FALSE);
saveProjectConfig(project, config);
pushForReviewRejected(testRepo,
"invalid Change-Id line format in commit message footer");
}
private static RevCommit createCommit(TestRepository<?> testRepo,
String message) throws Exception {
return testRepo.branch("HEAD").commit().message(message)
.add("a.txt", "content").create();
}
@Test @Test
public void cantAutoCloseChangeAlreadyMergedToBranch() throws Exception { public void cantAutoCloseChangeAlreadyMergedToBranch() throws Exception {
PushOneCommit.Result r1 = createChange(); PushOneCommit.Result r1 = createChange();
@@ -1239,4 +1306,27 @@ public abstract class AbstractPushForReview extends AbstractDaemonTest {
assertThat(cds).named("change " + id).hasSize(1); assertThat(cds).named("change " + id).hasSize(1);
return cds.get(0); return cds.get(0);
} }
private static void pushForReviewOk(TestRepository<?> testRepo)
throws GitAPIException {
pushForReview(testRepo, RemoteRefUpdate.Status.OK, null);
}
private static void pushForReviewRejected(TestRepository<?> testRepo,
String expectedMessage) throws GitAPIException {
pushForReview(testRepo, RemoteRefUpdate.Status.REJECTED_OTHER_REASON,
expectedMessage);
}
private static void pushForReview(TestRepository<?> testRepo,
RemoteRefUpdate.Status expectedStatus, String expectedMessage)
throws GitAPIException {
String ref = "refs/for/master";
PushResult r = pushHead(testRepo, ref);
RemoteRefUpdate refUpdate = r.getRemoteUpdate(ref);
assertThat(refUpdate.getStatus()).isEqualTo(expectedStatus);
if (expectedMessage != null) {
assertThat(refUpdate.getMessage()).contains(expectedMessage);
}
}
} }

View File

@@ -50,7 +50,7 @@ public class RestApiMetrics {
errorCount = metrics.newCounter( errorCount = metrics.newCounter(
"http/server/rest_api/error_count", "http/server/rest_api/error_count",
new Description("REST API calls by view") new Description("REST API errors by view")
.setRate(), .setRate(),
view, view,
Field.ofInteger("error_code", "HTTP status code")); Field.ofInteger("error_code", "HTTP status code"));

View File

@@ -1762,13 +1762,6 @@ public class ReceiveCommits {
} }
String idStr = idList.get(idList.size() - 1).trim(); String idStr = idList.get(idList.size() - 1).trim();
if (idStr.matches("^I00*$")) {
// Reject this invalid line from EGit.
reject(magicBranch.cmd, "invalid Change-Id");
newChanges = Collections.emptyList();
return;
}
pending.add(new ChangeLookup(c, new Change.Key(idStr))); pending.add(new ChangeLookup(c, new Change.Key(idStr)));
int n = pending.size() + newChanges.size(); int n = pending.size() + newChanges.size();
if (maxBatchChanges != 0 && n > maxBatchChanges) { if (maxBatchChanges != 0 && n > maxBatchChanges) {

View File

@@ -268,7 +268,9 @@ public class CommitValidators {
throw new CommitValidationException(errMsg, messages); throw new CommitValidationException(errMsg, messages);
} else { } else {
String v = idList.get(idList.size() - 1).trim(); String v = idList.get(idList.size() - 1).trim();
if (!CHANGE_ID.matcher(v).matches()) { // Reject Change-Ids with wrong format and invalid placeholder ID from
// Egit (I0000000000000000000000000000000000000000).
if (!CHANGE_ID.matcher(v).matches() || v.matches("^I00*$")) {
String errMsg = String.format(INVALID_CHANGE_ID_MSG, sha1); String errMsg = String.format(INVALID_CHANGE_ID_MSG, sha1);
messages.add( messages.add(
getMissingChangeIdErrorMsg(errMsg, receiveEvent.commit)); getMissingChangeIdErrorMsg(errMsg, receiveEvent.commit));

View File

@@ -19,7 +19,7 @@
unset GREP_OPTIONS unset GREP_OPTIONS
CHANGE_ID_AFTER="Bug|Issue|Test|Feature|Fixes|Fixed" CHANGE_ID_AFTER="Bug|Depends-On|Issue|Test|Feature|Fixes|Fixed"
MSG="$1" MSG="$1"
# Check for, and add if missing, a unique Change-Id # Check for, and add if missing, a unique Change-Id