| Index: tools/gardening/bin/compare_failures.dart
|
| diff --git a/tools/gardening/bin/compare_failures.dart b/tools/gardening/bin/compare_failures.dart
|
| index 8ccf5d66ce898ebf4e27ef016d073cd13e011397..ae85bac8815b92feda8b9da73077d7c5f2a59d94 100644
|
| --- a/tools/gardening/bin/compare_failures.dart
|
| +++ b/tools/gardening/bin/compare_failures.dart
|
| @@ -14,15 +14,28 @@ import 'package:gardening/src/buildbot_structures.dart';
|
| import 'package:gardening/src/buildbot_loading.dart';
|
| import 'package:gardening/src/util.dart';
|
|
|
| +void help(ArgParser argParser) {
|
| + print('Given a <log-uri> finds all failing tests in that stdout. Then ');
|
| + print('fetches earlier runs of the same bot and compares the results.');
|
| + print('This tool is particularly useful to detect flakes and their ');
|
| + print('frequency.');
|
| + print('Usage: compare_failures [options] <log-uri>');
|
| + print('where <log-uri> is the uri the stdio output of a failing test step');
|
| + print('and options are:');
|
| + print(argParser.usage);
|
| +}
|
| +
|
| main(List<String> args) async {
|
| ArgParser argParser = createArgParser();
|
| + argParser.addOption("run-count",
|
| + defaultsTo: "10", help: "How many previous runs should be fetched");
|
| ArgResults argResults = argParser.parse(args);
|
| processArgResults(argResults);
|
| - if (argResults.rest.length != 1) {
|
| - print('Usage: compare_failures [options] <log-uri>');
|
| - print('where <log-uri> is the uri the stdio output of a failing test step');
|
| - print('and options are:');
|
| - print(argParser.usage);
|
| + var runCount = int.parse(argResults['run-count'], onError: (_) => null);
|
| +
|
| + if (argResults.rest.length != 1 || argResults['help'] || runCount == null) {
|
| + help(argParser);
|
| + if (argResults['help']) return;
|
| exit(1);
|
| }
|
| String url = argResults.rest.first;
|
| @@ -33,7 +46,8 @@ main(List<String> args) async {
|
| Uri uri = Uri.parse(url);
|
| HttpClient client = new HttpClient();
|
| BuildUri buildUri = new BuildUri(uri);
|
| - List<BuildResult> results = await readBuildResults(client, buildUri);
|
| + List<BuildResult> results =
|
| + await readBuildResults(client, buildUri, runCount);
|
| print(generateBuildResultsSummary(buildUri, results));
|
| client.close();
|
| }
|
| @@ -41,12 +55,12 @@ main(List<String> args) async {
|
| /// Creates a [BuildResult] for [buildUri] and, if it contains failures, the
|
| /// [BuildResult]s for the previous 5 builds.
|
| Future<List<BuildResult>> readBuildResults(
|
| - HttpClient client, BuildUri buildUri) async {
|
| + HttpClient client, BuildUri buildUri, int runCount) async {
|
| List<BuildResult> summaries = <BuildResult>[];
|
| BuildResult firstSummary = await readBuildResult(client, buildUri);
|
| summaries.add(firstSummary);
|
| if (firstSummary.hasFailures) {
|
| - for (int i = 0; i < 10; i++) {
|
| + for (int i = 0; i < runCount; i++) {
|
| buildUri = buildUri.prev();
|
| summaries.add(await readBuildResult(client, buildUri));
|
| }
|
|
|