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