Search in sources :

Example 1 with Label

use of com.google.gerrit.entities.SubmitRecord.Label 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)

Example 2 with Label

use of com.google.gerrit.entities.SubmitRecord.Label in project gerrit by GerritCodeReview.

the class SubmitRequirementsAdapter method createFromDefaultSubmitRecord.

private static List<SubmitRequirementResult> createFromDefaultSubmitRecord(List<Label> labels, List<LabelType> labelTypes, ObjectId psCommitId, boolean isForced) {
    ImmutableList.Builder<SubmitRequirementResult> result = ImmutableList.builder();
    for (Label label : labels) {
        if (skipSubmitRequirementFor(label)) {
            continue;
        }
        Optional<LabelType> maybeLabelType = getLabelType(labelTypes, label.label);
        if (!maybeLabelType.isPresent()) {
            // if it was blocking or not, hence we skip the label.
            continue;
        }
        LabelType labelType = maybeLabelType.get();
        if (!isBlocking(labelType)) {
            continue;
        }
        ImmutableList<String> atoms = toExpressionAtomList(labelType);
        SubmitRequirement.Builder req = SubmitRequirement.builder().setName(label.label).setSubmittabilityExpression(toExpression(atoms)).setAllowOverrideInChildProjects(labelType.isCanOverride());
        result.add(SubmitRequirementResult.builder().legacy(Optional.of(true)).submitRequirement(req.build()).submittabilityExpressionResult(createExpressionResult(toExpression(atoms), mapStatus(label), atoms)).patchSetCommitId(psCommitId).forced(Optional.of(isForced)).build());
    }
    return result.build();
}
Also used : SubmitRequirement(com.google.gerrit.entities.SubmitRequirement) ImmutableList(com.google.common.collect.ImmutableList) LabelType(com.google.gerrit.entities.LabelType) Label(com.google.gerrit.entities.SubmitRecord.Label) SubmitRequirementResult(com.google.gerrit.entities.SubmitRequirementResult)

Example 3 with Label

use of com.google.gerrit.entities.SubmitRecord.Label in project gerrit by GerritCodeReview.

the class SubmitRequirementsAdapter method createFromCustomSubmitRecord.

private static List<SubmitRequirementResult> createFromCustomSubmitRecord(SubmitRecord record, ObjectId psCommitId, boolean isForced) {
    String ruleName = record.ruleName != null ? record.ruleName : "Custom-Rule";
    if (record.labels == null || record.labels.isEmpty()) {
        SubmitRequirement sr = SubmitRequirement.builder().setName(ruleName).setSubmittabilityExpression(SubmitRequirementExpression.create(String.format("rule:%s", ruleName))).setAllowOverrideInChildProjects(false).build();
        return ImmutableList.of(SubmitRequirementResult.builder().legacy(Optional.of(true)).submitRequirement(sr).submittabilityExpressionResult(createExpressionResult(sr.submittabilityExpression(), mapStatus(record), ImmutableList.of(ruleName), record.errorMessage)).patchSetCommitId(psCommitId).forced(Optional.of(isForced)).build());
    }
    ImmutableList.Builder<SubmitRequirementResult> result = ImmutableList.builder();
    for (Label label : record.labels) {
        if (skipSubmitRequirementFor(label)) {
            continue;
        }
        String expressionString = String.format("label:%s=%s", label.label, ruleName);
        SubmitRequirement sr = SubmitRequirement.builder().setName(label.label).setSubmittabilityExpression(SubmitRequirementExpression.create(expressionString)).setAllowOverrideInChildProjects(false).build();
        result.add(SubmitRequirementResult.builder().legacy(Optional.of(true)).submitRequirement(sr).submittabilityExpressionResult(createExpressionResult(sr.submittabilityExpression(), mapStatus(label), ImmutableList.of(expressionString))).patchSetCommitId(psCommitId).build());
    }
    return result.build();
}
Also used : SubmitRequirement(com.google.gerrit.entities.SubmitRequirement) ImmutableList(com.google.common.collect.ImmutableList) Label(com.google.gerrit.entities.SubmitRecord.Label) SubmitRequirementResult(com.google.gerrit.entities.SubmitRequirementResult)

Example 4 with Label

use of com.google.gerrit.entities.SubmitRecord.Label in project gerrit by GerritCodeReview.

the class SubmitRequirementsAdapterTest method createLabel.

private Label createLabel(String name, Label.Status status) {
    Label label = new Label();
    label.label = name;
    label.status = status;
    return label;
}
Also used : Label(com.google.gerrit.entities.SubmitRecord.Label)

Aggregations

Label (com.google.gerrit.entities.SubmitRecord.Label)4 ImmutableList (com.google.common.collect.ImmutableList)3 SubmitRequirement (com.google.gerrit.entities.SubmitRequirement)3 SubmitRequirementResult (com.google.gerrit.entities.SubmitRequirementResult)3 LabelType (com.google.gerrit.entities.LabelType)2 Strings (com.google.common.base.Strings)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 FluentLogger (com.google.common.flogger.FluentLogger)1 SubmitRecord (com.google.gerrit.entities.SubmitRecord)1 SubmitRequirementExpression (com.google.gerrit.entities.SubmitRequirementExpression)1 SubmitRequirementExpressionResult (com.google.gerrit.entities.SubmitRequirementExpressionResult)1 Status (com.google.gerrit.entities.SubmitRequirementExpressionResult.Status)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