Index: tools/gardening/lib/src/compare_failures_impl.dart |
diff --git a/tools/gardening/bin/compare_failures.dart b/tools/gardening/lib/src/compare_failures_impl.dart |
similarity index 71% |
copy from tools/gardening/bin/compare_failures.dart |
copy to tools/gardening/lib/src/compare_failures_impl.dart |
index de888914be7afeb83cc238627fb96899dad3d456..d3d77198061be4d9de8b975fb5ff855a0099b324 100644 |
--- a/tools/gardening/bin/compare_failures.dart |
+++ b/tools/gardening/lib/src/compare_failures_impl.dart |
@@ -7,53 +7,56 @@ |
/// Use this to detect flakiness of failures, especially timeouts. |
import 'dart:async'; |
-import 'dart:io'; |
-import 'package:args/args.dart'; |
import 'package:gardening/src/buildbot_structures.dart'; |
+import 'package:gardening/src/buildbot_data.dart'; |
import 'package:gardening/src/client.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); |
+Future mainInternal(BuildbotClient client, List<String> args, |
+ {int runCount: 10}) async { |
+ printBuildResultsSummary( |
+ await loadBuildResults(client, args, runCount: runCount)); |
} |
-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); |
- |
- BuildbotClient client = argResults['logdog'] |
- ? new LogdogBuildbotClient() |
- : new HttpBuildbotClient(); |
- |
- 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); |
+/// Loads [BuildResult]s for the [runCount] last builds for the build(s) in |
+/// [args]. [args] can be a list of [BuildGroup] names or a list of log uris. |
+Future<Map<BuildUri, List<BuildResult>>> loadBuildResults( |
+ BuildbotClient client, List<String> args, |
+ {int runCount: 10}) async { |
+ List<BuildUri> buildUriList = <BuildUri>[]; |
+ for (BuildGroup buildGroup in buildGroups) { |
+ if (args.contains(buildGroup.groupName)) { |
+ buildUriList.addAll(buildGroup.createUris(client.mostRecentBuildNumber)); |
+ } |
+ } |
+ if (buildUriList.isEmpty) { |
+ for (String url in args) { |
+ if (!url.endsWith('/text')) { |
+ // Use the text version of the stdio log. |
+ url += '/text'; |
+ } |
+ Uri uri = Uri.parse(url); |
+ BuildUri buildUri = new BuildUri(uri); |
+ buildUriList.add(buildUri); |
+ } |
} |
- String url = argResults.rest.first; |
- if (!url.endsWith('/text')) { |
- // Use the text version of the stdio log. |
- url += '/text'; |
+ Map<BuildUri, List<BuildResult>> buildResults = |
+ <BuildUri, List<BuildResult>>{}; |
+ for (BuildUri buildUri in buildUriList) { |
+ List<BuildResult> results = |
+ await readBuildResults(client, buildUri, runCount); |
+ buildResults[buildUri] = results; |
} |
- Uri uri = Uri.parse(url); |
- BuildUri buildUri = new BuildUri(uri); |
- List<BuildResult> results = |
- await readBuildResults(client, buildUri, runCount); |
- print(generateBuildResultsSummary(buildUri, results)); |
- client.close(); |
+ return buildResults; |
+} |
+ |
+/// Prints summaries for the [buildResults]. |
+// TODO(johnniwinther): Improve printing of multiple [BuildUri] results. |
+void printBuildResultsSummary(Map<BuildUri, List<BuildResult>> buildResults) { |
+ buildResults.forEach((BuildUri buildUri, List<BuildResult> results) { |
+ print(generateBuildResultsSummary(buildUri, results)); |
+ }); |
} |
/// Creates a [BuildResult] for [buildUri] and, if it contains failures, the |
@@ -154,5 +157,8 @@ String generateBuildResultsSummary( |
sb.write('\n'); |
}); |
} |
+ if (timeoutIds.isEmpty && errorIds.isEmpty) { |
+ sb.write('No errors found.'); |
+ } |
return sb.toString(); |
} |