| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:io'; | 6 import 'dart:io'; |
| 7 import 'util.dart'; | 7 import 'util.dart'; |
| 8 | 8 |
| 9 import 'buildbot_structures.dart'; | 9 import 'buildbot_structures.dart'; |
| 10 import 'cache.dart'; | 10 import 'cache.dart'; |
| 11 import 'logdog.dart'; | 11 import 'logdog.dart'; |
| 12 | 12 |
| 13 const String BUILDBOT_BUILDNUMBER = ' BUILDBOT_BUILDNUMBER: '; | 13 const String BUILDBOT_BUILDNUMBER = ' BUILDBOT_BUILDNUMBER: '; |
| 14 const String BUILDBOT_REVISION = ' BUILDBOT_REVISION: '; |
| 14 | 15 |
| 15 /// Read the build result for [buildUri]. | 16 /// Read the build result for [buildUri]. |
| 16 /// | 17 /// |
| 17 /// The data is loaded from the cache, if available, otherwise [read] is called | 18 /// The data is loaded from the cache, if available, otherwise [read] is called |
| 18 /// to fetch the data and stored in the cache afterwards. | 19 /// to fetch the data and stored in the cache afterwards. |
| 19 Future<BuildResult> _readBuildResult( | 20 Future<BuildResult> _readBuildResult( |
| 20 BuildUri buildUri, Future<String> read()) async { | 21 BuildUri buildUri, Future<String> read()) async { |
| 21 if (buildUri.buildNumber < 0) { | 22 if (buildUri.buildNumber < 0) { |
| 22 String text = await read(); | 23 String text = await read(); |
| 23 BuildResult result = parseTestStepResult(buildUri, text); | 24 BuildResult result = parseTestStepResult(buildUri, text); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 new TestConfiguration(configName, archName, testName), status); | 72 new TestConfiguration(configName, archName, testName), status); |
| 72 } catch (_) { | 73 } catch (_) { |
| 73 return null; | 74 return null; |
| 74 } | 75 } |
| 75 } | 76 } |
| 76 | 77 |
| 77 /// Parses the [buildUri] test log and creates a [BuildResult] for it. | 78 /// Parses the [buildUri] test log and creates a [BuildResult] for it. |
| 78 BuildResult parseTestStepResult(BuildUri buildUri, String text) { | 79 BuildResult parseTestStepResult(BuildUri buildUri, String text) { |
| 79 log('Parsing results: $buildUri (${text.length} bytes)'); | 80 log('Parsing results: $buildUri (${text.length} bytes)'); |
| 80 int buildNumber; | 81 int buildNumber; |
| 82 String buildRevision; |
| 81 List<String> currentFailure; | 83 List<String> currentFailure; |
| 82 bool parsingTimingBlock = false; | 84 bool parsingTimingBlock = false; |
| 83 | 85 |
| 84 List<TestStatus> results = <TestStatus>[]; | 86 List<TestStatus> results = <TestStatus>[]; |
| 85 List<TestFailure> failures = <TestFailure>[]; | 87 List<TestFailure> failures = <TestFailure>[]; |
| 86 List<Timing> timings = <Timing>[]; | 88 List<Timing> timings = <Timing>[]; |
| 87 for (String line in text.split('\n')) { | 89 for (String line in text.split('\n')) { |
| 88 if (line.startsWith(BUILDBOT_BUILDNUMBER)) { | 90 if (line.startsWith(BUILDBOT_BUILDNUMBER)) { |
| 89 buildNumber = | 91 buildNumber = |
| 90 int.parse(line.substring(BUILDBOT_BUILDNUMBER.length).trim()); | 92 int.parse(line.substring(BUILDBOT_BUILDNUMBER.length).trim()); |
| 91 buildUri = buildUri.withBuildNumber(buildNumber); | 93 buildUri = buildUri.withBuildNumber(buildNumber); |
| 92 } | 94 } |
| 95 if (line.startsWith(BUILDBOT_REVISION)) { |
| 96 buildRevision = line.substring(BUILDBOT_REVISION.length).trim(); |
| 97 } |
| 93 if (currentFailure != null) { | 98 if (currentFailure != null) { |
| 94 if (line.startsWith('Done ')) { | 99 if (line.startsWith('Done ')) { |
| 95 TestStatus status = parseTestStatus(line); | 100 TestStatus status = parseTestStatus(line); |
| 96 if (status != null) { | 101 if (status != null) { |
| 97 results.add(status); | 102 results.add(status); |
| 98 failures.add(new TestFailure(buildUri, currentFailure)); | 103 failures.add(new TestFailure(buildUri, currentFailure)); |
| 99 currentFailure = null; | 104 currentFailure = null; |
| 100 } | 105 } |
| 101 } else { | 106 } else { |
| 102 currentFailure.add(line); | 107 currentFailure.add(line); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 114 parsingTimingBlock = true; | 119 parsingTimingBlock = true; |
| 115 } else if (parsingTimingBlock) { | 120 } else if (parsingTimingBlock) { |
| 116 if (line.startsWith('0:')) { | 121 if (line.startsWith('0:')) { |
| 117 timings.addAll(parseTimings(buildUri, line)); | 122 timings.addAll(parseTimings(buildUri, line)); |
| 118 } else { | 123 } else { |
| 119 parsingTimingBlock = false; | 124 parsingTimingBlock = false; |
| 120 } | 125 } |
| 121 } | 126 } |
| 122 } | 127 } |
| 123 return new BuildResult(buildUri, buildNumber ?? buildUri.absoluteBuildNumber, | 128 return new BuildResult(buildUri, buildNumber ?? buildUri.absoluteBuildNumber, |
| 124 results, failures, timings); | 129 buildRevision, results, failures, timings); |
| 125 } | 130 } |
| 126 | 131 |
| 127 /// Create the [Timing]s for the [line] as found in the top-20 timings of a | 132 /// Create the [Timing]s for the [line] as found in the top-20 timings of a |
| 128 /// build step stdio log. | 133 /// build step stdio log. |
| 129 List<Timing> parseTimings(BuildUri uri, String line) { | 134 List<Timing> parseTimings(BuildUri uri, String line) { |
| 130 List<String> parts = split(line, [' - ', ' - ', ' ']); | 135 List<String> parts = split(line, [' - ', ' - ', ' ']); |
| 131 String time = parts[0]; | 136 String time = parts[0]; |
| 132 String stepName = parts[1]; | 137 String stepName = parts[1]; |
| 133 String configName = parts[2]; | 138 String configName = parts[2]; |
| 134 String testNames = parts[3]; | 139 String testNames = parts[3]; |
| 135 List<Timing> timings = <Timing>[]; | 140 List<Timing> timings = <Timing>[]; |
| 136 for (String name in testNames.split(',')) { | 141 for (String name in testNames.split(',')) { |
| 137 name = name.trim(); | 142 name = name.trim(); |
| 138 int slashPos = name.indexOf('/'); | 143 int slashPos = name.indexOf('/'); |
| 139 String archName = name.substring(0, slashPos); | 144 String archName = name.substring(0, slashPos); |
| 140 String testName = name.substring(slashPos + 1); | 145 String testName = name.substring(slashPos + 1); |
| 141 timings.add(new Timing( | 146 timings.add(new Timing( |
| 142 uri, | 147 uri, |
| 143 time, | 148 time, |
| 144 new TestStep( | 149 new TestStep( |
| 145 stepName, new TestConfiguration(configName, archName, testName)))); | 150 stepName, new TestConfiguration(configName, archName, testName)))); |
| 146 } | 151 } |
| 147 return timings; | 152 return timings; |
| 148 } | 153 } |
| OLD | NEW |