Evaluate submit requirements in submittability checks
The autosubmitter only evaluated legacy submit records from label
functions and ignored Submit Requirements (SRs). Since Gerrit 3.6, SRs
are the standard way to define submittability. As a result, the plugin
attempted to merge changes that were not actually submittable when SRs
were unsatisfied.
This change checks submittability using
ChangeData.submitRequirementsIncludingLegacy() and verifies that each
requirement is fulfilled before proceeding. This aligns the plugin’s
behavior with Gerrit’s submittability model and prevents premature
submission attempts.
Bug: Issue 458294128
Change-Id: I4df85941ecf518ab2875eeb1ef2a02c0bd4be1b5
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
index 85d6ff5..70d4385 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
@@ -18,7 +18,8 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.entities.Project;
-import com.google.gerrit.entities.SubmitRecord;
+import com.google.gerrit.entities.SubmitRequirement;
+import com.google.gerrit.entities.SubmitRequirementResult;
import com.google.gerrit.exceptions.StorageException;
import com.google.gerrit.extensions.api.changes.RelatedChangeAndCommitInfo;
import com.google.gerrit.extensions.api.changes.RelatedChangesInfo;
@@ -34,14 +35,12 @@
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.NoSuchChangeException;
import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.SubmitRuleEvaluator;
-import com.google.gerrit.server.project.SubmitRuleOptions;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.restapi.change.GetRelated;
import com.google.gerrit.server.restapi.change.Submit;
import com.google.inject.Inject;
import java.io.IOException;
-import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -66,8 +65,6 @@
@Inject PermissionBackend permissionBackend;
- @Inject SubmitRuleEvaluator.Factory submitRuleEvaluatorFactory;
-
@Inject ChangeResource.Factory changeResourceFactory;
/**
@@ -141,13 +138,15 @@
ChangeData changeData =
changeDataFactory.create(
Project.nameKey(project), com.google.gerrit.entities.Change.id(change));
- // For draft reviews, the patchSet must be set to avoid an NPE.
- final List<SubmitRecord> cansubmit =
- submitRuleEvaluatorFactory.create(SubmitRuleOptions.defaults()).evaluate(changeData);
- log.debug(String.format("Checking if change %d is submitable.", change));
- for (SubmitRecord submit : cansubmit) {
- if (submit.status != SubmitRecord.Status.OK) {
- log.debug(String.format("Change %d is not submitable", change));
+
+ for (Map.Entry<SubmitRequirement, SubmitRequirementResult> req :
+ changeData.submitRequirementsIncludingLegacy().entrySet()) {
+ log.debug(String.format("Checking if change %d is satisfy %s submit requirement.", change, req.getKey().name()));
+ if (!req.getValue().fulfilled()) {
+ log.debug(
+ String.format(
+ "Change %d is not submitable: requirement %s is not fulfilled",
+ change, req.getKey().name()));
return false;
}
}