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; } }