| // Copyright 2021 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 'dart:io' as io; |
| |
| import 'package:cocoon_service/cocoon_service.dart'; |
| import 'package:cocoon_service/src/foundation/utils.dart'; |
| import 'package:file/file.dart'; |
| import 'package:file/local.dart'; |
| import 'package:github/github.dart'; |
| import 'package:http/http.dart' as http; |
| |
| /// Remote check based on flutter `repo` and the commit `ref`. |
| /// |
| /// This currently supports `flutter/flutter` only. |
| Future<List<String>> remoteCheck(String repo, String ref) async { |
| final String ciYamlContent = await githubFileContent( |
| RepositorySlug('flutter', repo), |
| kCiYamlPath, |
| httpClientProvider: () => http.Client(), |
| ref: ref, |
| ); |
| final String testOwnersContent = await githubFileContent( |
| RepositorySlug('flutter', repo), |
| kTestOwnerPath, |
| httpClientProvider: () => http.Client(), |
| ref: ref, |
| ); |
| |
| final List<String> noOwnerBuilders = validateOwnership(ciYamlContent, testOwnersContent); |
| return noOwnerBuilders; |
| } |
| |
| /// Local check is based on paths to the local `.ci.yaml` and `TESTOWNERS` files. |
| List<String> localCheck(String ciYamlPath, String testOwnersPath) { |
| const FileSystem fs = LocalFileSystem(); |
| final File ciYamlFile = fs.file(ciYamlPath); |
| final File testOwnersFile = fs.file(testOwnersPath); |
| if (!ciYamlFile.existsSync() || !testOwnersFile.existsSync()) { |
| print('Make sure ciYamlPath and testOwnersPath exist.'); |
| io.exit(1); |
| } |
| final List<String> noOwnerBuilders = |
| validateOwnership(ciYamlFile.readAsStringSync(), testOwnersFile.readAsStringSync()); |
| return noOwnerBuilders; |
| } |
| |
| /// Validates task ownership. |
| /// |
| /// It expects two parameters for remote validation: the flutter `repo` and the `commit`. |
| /// |
| /// It expects three parameters for local validation: `local` arg, the full path to the config |
| /// file (`.ci.yaml`), and the full pathto the `TESTOWNERS` file. |
| Future<void> main(List<String> args) async { |
| if (args.length != 2 && args.length != 3) { |
| print('validate_task_ownership.dart \$repo \$sha'); |
| print('validate_task_ownership.dart local \$local_ci_yaml \$lcoal_TESTOWNERS'); |
| io.exit(1); |
| } |
| List<String> noOwnerBuilders; |
| if (args.length == 2) { |
| noOwnerBuilders = await remoteCheck(args[0], args[1]); |
| } else { |
| noOwnerBuilders = localCheck(args[1], args[2]); |
| } |
| if (noOwnerBuilders.isNotEmpty) { |
| print('# Test ownership check failed.'); |
| print('Builders missing owner: $noOwnerBuilders'); |
| print('Please define ownership in https://github.com/flutter/flutter/blob/master/TESTOWNERS'); |
| io.exit(1); |
| } else { |
| print('# Test ownership check succeeded.'); |
| } |
| } |