| // Copyright 2023 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:auto_submit/exception/configuration_exception.dart'; |
| import 'package:yaml/yaml.dart'; |
| |
| /// The RepositoryConfiguration stores the pertinent information that autosubmit |
| /// will need when submiting and validating pull requests for a particular |
| /// repository. |
| class RepositoryConfiguration { |
| // Autosubmit configuration keys as found in the both the global and local |
| // yaml configuraiton files. |
| static const String allowConfigOverrideKey = 'allow_config_override'; |
| static const String defaultBranchKey = 'default_branch'; |
| static const String autoApprovalAccountsKey = 'auto_approval_accounts'; |
| static const String approvingReviewsKey = 'approving_reviews'; |
| static const String approvalGroupKey = 'approval_group'; |
| static const String runCiKey = 'run_ci'; |
| static const String supportNoReviewRevertKey = 'support_no_review_revert'; |
| static const String requiredCheckRunsOnRevertKey = 'required_checkruns_on_revert'; |
| |
| static const String defaultBranchStr = 'default'; |
| |
| RepositoryConfiguration({ |
| allowConfigOverride, |
| defaultBranch, |
| autoApprovalAccounts, |
| approvingReviews, |
| approvalGroup, |
| runCi, |
| supportNoReviewReverts, |
| requiredCheckRunsOnRevert, |
| }) : allowConfigOverride = allowConfigOverride ?? false, |
| defaultBranch = defaultBranch ?? defaultBranchStr, |
| autoApprovalAccounts = autoApprovalAccounts ?? <String>{}, |
| approvingReviews = approvingReviews ?? 2, |
| approvalGroup = approvalGroup ?? 'flutter-hackers', |
| runCi = runCi ?? true, |
| supportNoReviewReverts = supportNoReviewReverts ?? true, |
| requiredCheckRunsOnRevert = requiredCheckRunsOnRevert ?? <String>{}; |
| |
| /// This flag allows the repository to override the org level configuration. |
| bool allowConfigOverride; |
| |
| /// The default branch that pull requests will be merged into. |
| String defaultBranch; |
| |
| /// The accounts that have auto approval on their pull requests. |
| Set<String> autoApprovalAccounts; |
| |
| /// The number of reviews needed for a pull request. If the reviewer is part |
| /// of the approval group they will need ([approvingReviews] - 1) number of |
| /// reviews in order to merge the pull request, if they are not part of the |
| /// approval group the will need [approvingReviews] number of reviews. |
| int approvingReviews; |
| |
| /// The group that the pull request author will need pull requests from. |
| String approvalGroup; |
| |
| /// Flag to determine whether or not to wait for all the ci checks to finish |
| /// before allowing a merge of the pull request. |
| bool runCi; |
| |
| /// Flag that determines if reverts are allowed without a review. |
| bool supportNoReviewReverts; |
| |
| /// Set of checkruns that must complete before a revert pull request can be |
| /// merged. |
| Set<String> requiredCheckRunsOnRevert; |
| |
| @override |
| String toString() { |
| final StringBuffer stringBuffer = StringBuffer(); |
| stringBuffer.writeln('$allowConfigOverrideKey: $allowConfigOverride'); |
| stringBuffer.writeln('$defaultBranchKey: $defaultBranch'); |
| stringBuffer.writeln('$autoApprovalAccountsKey:'); |
| for (String account in autoApprovalAccounts) { |
| stringBuffer.writeln(' - $account'); |
| } |
| stringBuffer.writeln('$approvingReviewsKey: $approvingReviews'); |
| stringBuffer.writeln('$approvalGroupKey: $approvalGroup'); |
| stringBuffer.writeln('$runCiKey: $runCi'); |
| stringBuffer.writeln('$supportNoReviewRevertKey: $supportNoReviewReverts'); |
| stringBuffer.writeln('$requiredCheckRunsOnRevertKey:'); |
| for (String checkrun in requiredCheckRunsOnRevert) { |
| stringBuffer.writeln(' - $checkrun'); |
| } |
| return stringBuffer.toString(); |
| } |
| |
| static RepositoryConfiguration fromYaml(String yaml) { |
| final dynamic yamlDoc = loadYaml(yaml); |
| |
| final Set<String> autoApprovalAccounts = <String>{}; |
| final YamlList? yamlAutoApprovalAccounts = yamlDoc[autoApprovalAccountsKey]; |
| if (yamlAutoApprovalAccounts != null) { |
| for (YamlNode element in yamlAutoApprovalAccounts.nodes) { |
| autoApprovalAccounts.add(element.value as String); |
| } |
| } |
| |
| if (yamlDoc[approvalGroupKey] == null) { |
| throw ConfigurationException('The approval group is a required field.'); |
| } |
| |
| final Set<String> requiredCheckRunsOnRevert = <String>{}; |
| final YamlList? yamlRequiredCheckRuns = yamlDoc[requiredCheckRunsOnRevertKey]; |
| if (yamlRequiredCheckRuns != null) { |
| for (YamlNode element in yamlRequiredCheckRuns.nodes) { |
| requiredCheckRunsOnRevert.add(element.value as String); |
| } |
| } |
| |
| return RepositoryConfiguration( |
| allowConfigOverride: yamlDoc[allowConfigOverrideKey], |
| defaultBranch: yamlDoc[defaultBranchKey], |
| autoApprovalAccounts: autoApprovalAccounts, |
| approvingReviews: yamlDoc[approvingReviewsKey], |
| approvalGroup: yamlDoc[approvalGroupKey], |
| runCi: yamlDoc[runCiKey], |
| supportNoReviewReverts: yamlDoc[supportNoReviewRevertKey], |
| requiredCheckRunsOnRevert: requiredCheckRunsOnRevert, |
| ); |
| } |
| } |