Search in sources :

Example 1 with Status

use of com.google.gerrit.entities.SubmitRequirementExpressionResult.Status in project gerrit by GerritCodeReview.

the class SubmitRequirementsAdapter method getLegacyRequirements.

/**
 * Retrieve legacy submit records (created by label functions and other {@link
 * com.google.gerrit.server.rules.SubmitRule}s) and convert them to submit requirement results.
 */
public static Map<SubmitRequirement, SubmitRequirementResult> getLegacyRequirements(ChangeData cd) {
    // We use SubmitRuleOptions.defaults() which does not recompute submit rules for closed changes.
    // This doesn't have an effect since we never call this class (i.e. to evaluate submit
    // requirements) for closed changes.
    List<SubmitRecord> records = cd.submitRecords(SubmitRuleOptions.defaults());
    boolean areForced = records.stream().anyMatch(record -> SubmitRecord.Status.FORCED.equals(record.status));
    List<LabelType> labelTypes = cd.getLabelTypes().getLabelTypes();
    ObjectId commitId = cd.currentPatchSet().commitId();
    Map<String, List<SubmitRequirementResult>> srsByName = records.stream().filter(r -> !SubmitRecord.Status.FORCED.equals(r.status)).map(r -> createResult(r, labelTypes, commitId, areForced)).flatMap(List::stream).collect(Collectors.groupingBy(sr -> sr.submitRequirement().name()));
    // We convert submit records to submit requirements by generating a separate
    // submit requirement result for each available label in each submit record.
    // The SR status is derived from the label status of the submit record.
    // This conversion might result in duplicate entries.
    // One such example can be a prolog rule emitting the same label name twice.
    // Another case might happen if two different submit rules emit the same label
    // name. In such cases, we need to merge these entries and return a single submit
    // requirement result. If both entries agree in their status, return any of them.
    // Otherwise, favour the entry that is blocking submission.
    ImmutableMap.Builder<SubmitRequirement, SubmitRequirementResult> result = ImmutableMap.builder();
    for (Map.Entry<String, List<SubmitRequirementResult>> entry : srsByName.entrySet()) {
        if (entry.getValue().size() == 1) {
            SubmitRequirementResult srResult = entry.getValue().iterator().next();
            result.put(srResult.submitRequirement(), srResult);
            continue;
        }
        // If all submit requirements with the same name match in status, return the first one.
        List<SubmitRequirementResult> resultsSameName = entry.getValue();
        boolean allNonBlocking = resultsSameName.stream().allMatch(sr -> sr.fulfilled());
        if (allNonBlocking) {
            result.put(resultsSameName.get(0).submitRequirement(), resultsSameName.get(0));
        } else {
            // Otherwise, return the first submit requirement result that is blocking submission.
            Optional<SubmitRequirementResult> nonFulfilled = resultsSameName.stream().filter(sr -> !sr.fulfilled()).findFirst();
            if (nonFulfilled.isPresent()) {
                result.put(nonFulfilled.get().submitRequirement(), nonFulfilled.get());
            }
        }
    }
    return result.build();
}
Also used : ImmutableMap(com.google.common.collect.ImmutableMap) SubmitRequirementExpression(com.google.gerrit.entities.SubmitRequirementExpression) SubmitRecord(com.google.gerrit.entities.SubmitRecord) DefaultSubmitRule(com.google.gerrit.server.rules.DefaultSubmitRule) Collectors(java.util.stream.Collectors) ObjectId(org.eclipse.jgit.lib.ObjectId) SubmitRequirementExpressionResult(com.google.gerrit.entities.SubmitRequirementExpressionResult) SubmitRequirementResult(com.google.gerrit.entities.SubmitRequirementResult) Strings(com.google.common.base.Strings) ChangeData(com.google.gerrit.server.query.change.ChangeData) List(java.util.List) Label(com.google.gerrit.entities.SubmitRecord.Label) ImmutableList(com.google.common.collect.ImmutableList) LabelType(com.google.gerrit.entities.LabelType) ChangeQueryBuilder(com.google.gerrit.server.query.change.ChangeQueryBuilder) Map(java.util.Map) Optional(java.util.Optional) FluentLogger(com.google.common.flogger.FluentLogger) Status(com.google.gerrit.entities.SubmitRequirementExpressionResult.Status) SubmitRequirement(com.google.gerrit.entities.SubmitRequirement) ObjectId(org.eclipse.jgit.lib.ObjectId) ImmutableMap(com.google.common.collect.ImmutableMap) SubmitRecord(com.google.gerrit.entities.SubmitRecord) SubmitRequirement(com.google.gerrit.entities.SubmitRequirement) LabelType(com.google.gerrit.entities.LabelType) List(java.util.List) ImmutableList(com.google.common.collect.ImmutableList) SubmitRequirementResult(com.google.gerrit.entities.SubmitRequirementResult) ImmutableMap(com.google.common.collect.ImmutableMap) Map(java.util.Map)

Aggregations

Strings (com.google.common.base.Strings)1 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 FluentLogger (com.google.common.flogger.FluentLogger)1 LabelType (com.google.gerrit.entities.LabelType)1 SubmitRecord (com.google.gerrit.entities.SubmitRecord)1 Label (com.google.gerrit.entities.SubmitRecord.Label)1 SubmitRequirement (com.google.gerrit.entities.SubmitRequirement)1 SubmitRequirementExpression (com.google.gerrit.entities.SubmitRequirementExpression)1 SubmitRequirementExpressionResult (com.google.gerrit.entities.SubmitRequirementExpressionResult)1 Status (com.google.gerrit.entities.SubmitRequirementExpressionResult.Status)1 SubmitRequirementResult (com.google.gerrit.entities.SubmitRequirementResult)1 ChangeData (com.google.gerrit.server.query.change.ChangeData)1 ChangeQueryBuilder (com.google.gerrit.server.query.change.ChangeQueryBuilder)1 DefaultSubmitRule (com.google.gerrit.server.rules.DefaultSubmitRule)1 List (java.util.List)1 Map (java.util.Map)1 Optional (java.util.Optional)1 Collectors (java.util.stream.Collectors)1 ObjectId (org.eclipse.jgit.lib.ObjectId)1