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:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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"));
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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));
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user