blob: 62565c5a64f5b3d4432b745ef04d09eb20a3d842 [file] [log] [blame]
import 'dart:convert';
import 'dart:io';
import 'package:args/args.dart';
import 'package:builder/src/builder.dart';
import 'package:builder/src/commits_cache.dart';
import 'package:builder/src/firestore.dart';
import 'package:builder/src/result.dart';
import 'package:builder/src/status.dart';
import 'package:builder/src/tryjob.dart';
import 'package:googleapis/firestore/v1.dart';
import 'package:googleapis_auth/auth_io.dart';
import 'package:http/http.dart' as http;
late BuildInfo buildInfo;
Future<List<Map<String, dynamic>>> readChangedResults(File resultsFile) async {
final lines = (await resultsFile.readAsLines())
.map((line) => jsonDecode(line)! as Map<String, dynamic>);
if (lines.isEmpty) {
print('Empty input results.json file');
exit(1);
}
buildInfo = BuildInfo.fromResult(
lines.first, {for (final line in lines) line[fConfiguration]});
return lines.where(isChangedResult).toList();
}
File fileOption(options, String name) {
final path = options[name];
if (path == null) {
print("Required option '$name'!");
exit(1);
}
final file = File(path);
if (!file.existsSync()) {
print('File not found: "$path"');
exit(1);
}
return file;
}
Future<BuildStatus> processResults(options, client, firestore) async {
final inputFile = fileOption(options, 'results');
final results = await readChangedResults(inputFile);
final String? buildbucketID = options['buildbucket_id'];
final String? baseRevision = options['base_revision'];
final commitCache = CommitsCache(firestore, client);
if (buildInfo is TryBuildInfo) {
return Tryjob(buildInfo as TryBuildInfo, buildbucketID!, baseRevision!,
commitCache, firestore, client)
.process(results);
} else {
return Build(buildInfo, commitCache, firestore).process(results);
}
}
void main(List<String> arguments) async {
final options = (ArgParser()
..addOption('project',
abbr: 'p',
defaultsTo: 'dart-ci-staging',
allowed: ['dart-ci-staging', 'dart-ci'])
..addOption('results', abbr: 'r')
..addOption('buildbucket_id', abbr: 'i')
..addOption('base_revision', abbr: 'b')
..addOption('status_file'))
.parse(arguments);
final baseClient = http.Client();
final client = await clientViaApplicationDefaultCredentials(
scopes: ['https://www.googleapis.com/auth/cloud-platform'],
baseClient: baseClient);
final api = FirestoreApi(client);
final firestore = FirestoreService(api, client, project: options['project']);
final status = await processResults(options, client, firestore);
if (options['status_file'] != null) {
await File(options['status_file']).writeAsString(status.toJson());
}
baseClient.close();
}