Future _checkStatuses()

in app_dart/lib/src/request_handlers/check_for_waiting_pull_requests.dart [302:389]


  Future<bool> _checkStatuses(
    RepositorySlug slug,
    String sha,
    Set<_FailureDetail> failures,
    List<Map<String, dynamic>> statuses,
    List<Map<String, dynamic>> checkRuns,
    String name,
    String branch,
    List<String> labels,
  ) async {
    assert(failures.isEmpty);
    bool allSuccess = true;

    // The status checks that are not related to changes in this PR.
    const Set<String> notInAuthorsControl = <String>{
      'luci-flutter', // flutter repo
      'luci-engine', // engine repo
      'submit-queue', // plugins repo
    };

    // Ensure repos with tree statuses have it set
    if (Config.reposWithTreeStatus.contains(slug)) {
      bool treeStatusExists = false;
      final String treeStatusName = 'luci-${slug.name}';

      // Scan list of statuses to see if the tree status exists (this list is expected to be <5 items)
      for (Map<String, dynamic> status in statuses) {
        if (status['context'] == treeStatusName) {
          treeStatusExists = true;
        }
      }

      if (!treeStatusExists) {
        failures.add(_FailureDetail('tree status $treeStatusName', 'https://flutter-dashboard.appspot.com/#/build'));
      }
    }

    log.info('Validating name: $name, branch: $branch, status: $statuses');
    for (Map<String, dynamic> status in statuses) {
      final String? name = status['context'] as String?;
      if (status['state'] != 'SUCCESS') {
        if (notInAuthorsControl.contains(name) && labels.contains(await config.overrideTreeStatusLabel)) {
          continue;
        }
        allSuccess = false;
        if (status['state'] == 'FAILURE' && !notInAuthorsControl.contains(name)) {
          failures.add(_FailureDetail(name!, status['targetUrl'] as String));
        }
      }
    }
    log.info('Validating name: $name, branch: $branch, checks: $checkRuns');
    for (Map<String, dynamic> checkRun in checkRuns) {
      final String? name = checkRun['name'] as String?;
      if (checkRun['conclusion'] == 'SUCCESS') {
        continue;
      } else if (checkRun['status'] == 'COMPLETED') {
        failures.add(_FailureDetail(name!, checkRun['detailsUrl'] as String));
      }
      allSuccess = false;
    }

    // Validate cirrus
    const List<String> _failedStates = <String>['FAILED', 'ABORTED'];
    const List<String> _succeededStates = <String>['COMPLETED', 'SKIPPED'];
    final GraphQLClient cirrusClient = await config.createCirrusGraphQLClient();
    final List<CirrusResult> cirrusResults = await queryCirrusGraphQL(sha, cirrusClient, name);
    if (!cirrusResults.any((CirrusResult cirrusResult) => cirrusResult.branch == branch)) {
      return allSuccess;
    }
    final List<Map<String, dynamic>>? cirrusStatuses =
        cirrusResults.firstWhere((CirrusResult cirrusResult) => cirrusResult.branch == branch).tasks;
    if (cirrusStatuses == null) {
      return allSuccess;
    }
    for (Map<String, dynamic> runStatus in cirrusStatuses) {
      final String? status = runStatus['status'] as String?;
      final String? name = runStatus['name'] as String?;
      final String? id = runStatus['id'] as String?;
      if (!_succeededStates.contains(status)) {
        allSuccess = false;
      }
      if (_failedStates.contains(status)) {
        failures.add(_FailureDetail(name!, 'https://cirrus-ci.com/task/$id'));
      }
    }

    return allSuccess;
  }