Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library barback.package_graph; | 5 library barback.package_graph; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'asset_cascade.dart'; | 9 import 'asset_cascade.dart'; |
| 10 import 'asset_id.dart'; | 10 import 'asset_id.dart'; |
| 11 import 'asset_node.dart'; | 11 import 'asset_node.dart'; |
| 12 import 'asset_set.dart'; | 12 import 'asset_set.dart'; |
| 13 import 'barback_logger.dart'; | |
| 13 import 'build_result.dart'; | 14 import 'build_result.dart'; |
| 14 import 'errors.dart'; | 15 import 'errors.dart'; |
| 15 import 'package_provider.dart'; | 16 import 'package_provider.dart'; |
| 16 import 'transformer.dart'; | 17 import 'transformer.dart'; |
| 17 import 'utils.dart'; | 18 import 'utils.dart'; |
| 18 | 19 |
| 19 /// The collection of [AssetCascade]s for an entire application. | 20 /// The collection of [AssetCascade]s for an entire application. |
| 20 /// | 21 /// |
| 21 /// This tracks each package's [AssetCascade] and routes asset requests between | 22 /// This tracks each package's [AssetCascade] and routes asset requests between |
| 22 /// them. | 23 /// them. |
| 23 class PackageGraph { | 24 class PackageGraph { |
| 24 /// The provider that exposes asset and package information. | 25 /// The provider that exposes asset and package information. |
| 25 final PackageProvider provider; | 26 final PackageProvider provider; |
| 26 | 27 |
| 28 /// The logger used to report transformer log entries. If this is null, then | |
|
nweiz
2013/10/16 19:41:27
paragraph break
Bob Nystrom
2013/10/28 23:45:56
Done.
| |
| 29 /// [_defaultLogger] will be used instead. | |
|
nweiz
2013/10/16 19:41:27
_defaultLogger isn't defined anywhere
Bob Nystrom
2013/10/28 23:45:56
Done.
| |
| 30 final BarbackLogger _logger; | |
| 31 | |
| 27 /// The [AssetCascade] for each package. | 32 /// The [AssetCascade] for each package. |
| 28 final _cascades = <String, AssetCascade>{}; | 33 final _cascades = <String, AssetCascade>{}; |
| 29 | 34 |
| 30 /// The current [BuildResult] for each package's [AssetCascade]. | 35 /// The current [BuildResult] for each package's [AssetCascade]. |
| 31 /// | 36 /// |
| 32 /// The result for a given package will be `null` if that [AssetCascade] is | 37 /// The result for a given package will be `null` if that [AssetCascade] is |
| 33 /// actively building. | 38 /// actively building. |
| 34 final _cascadeResults = <String, BuildResult>{}; | 39 final _cascadeResults = <String, BuildResult>{}; |
| 35 | 40 |
| 36 /// A stream that emits a [BuildResult] each time the build is completed, | 41 /// A stream that emits a [BuildResult] each time the build is completed, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 55 Stream<BarbackException> _errors; | 60 Stream<BarbackException> _errors; |
| 56 | 61 |
| 57 /// The most recent error emitted from a cascade's result stream. | 62 /// The most recent error emitted from a cascade's result stream. |
| 58 /// | 63 /// |
| 59 /// This is used to pipe an unexpected error from a build to the resulting | 64 /// This is used to pipe an unexpected error from a build to the resulting |
| 60 /// [Future] returned by [getAllAssets]. | 65 /// [Future] returned by [getAllAssets]. |
| 61 var _lastUnexpectedError; | 66 var _lastUnexpectedError; |
| 62 | 67 |
| 63 /// Creates a new [PackageGraph] that will transform assets in all packages | 68 /// Creates a new [PackageGraph] that will transform assets in all packages |
| 64 /// made available by [provider]. | 69 /// made available by [provider]. |
| 65 PackageGraph(this.provider) { | 70 PackageGraph(this.provider, {BarbackLogger logger}) |
| 71 : _logger = logger != null ? logger : new BarbackLogger() { | |
| 66 for (var package in provider.packages) { | 72 for (var package in provider.packages) { |
| 67 var cascade = new AssetCascade(this, package); | 73 var cascade = new AssetCascade(this, package); |
| 68 // The initial result for each cascade is "success" since the cascade | 74 // The initial result for each cascade is "success" since the cascade |
| 69 // doesn't start building until some source in that graph is updated. | 75 // doesn't start building until some source in that graph is updated. |
| 70 _cascadeResults[package] = new BuildResult.success(); | 76 _cascadeResults[package] = new BuildResult.success(); |
| 71 _cascades[package] = cascade; | 77 _cascades[package] = cascade; |
| 72 cascade.onDirty.listen((_) { | 78 cascade.onDirty.listen((_) { |
| 73 _cascadeResults[package] = null; | 79 _cascadeResults[package] = null; |
| 74 }); | 80 }); |
| 75 | 81 |
| 82 cascade.onLog.listen(_logger.logEntry); | |
| 83 | |
| 76 cascade.results.listen((result) { | 84 cascade.results.listen((result) { |
| 77 _cascadeResults[cascade.package] = result; | 85 _cascadeResults[cascade.package] = result; |
| 78 // If any cascade hasn't yet finished, the overall build isn't finished | 86 // If any cascade hasn't yet finished, the overall build isn't finished |
| 79 // either. | 87 // either. |
| 80 if (_cascadeResults.values.any((result) => result == null)) return; | 88 if (_cascadeResults.values.any((result) => result == null)) return; |
| 81 | 89 |
| 90 var errors = unionAll( | |
| 91 _cascadeResults.values.map((result) => result.errors)); | |
| 92 | |
| 93 var numLogErrors = _cascadeResults.values.fold(0, | |
| 94 (numErrors, result) => result.numErrors - result.errors.length); | |
| 95 | |
| 82 // Include all build errors for all cascades. If no cascades have | 96 // Include all build errors for all cascades. If no cascades have |
| 83 // errors, the result will automatically be considered a success. | 97 // errors, the result will automatically be considered a success. |
| 84 _resultsController.add(new BuildResult(unionAll( | 98 _resultsController.add(new BuildResult(errors, numLogErrors)); |
| 85 _cascadeResults.values.map((result) => result.errors)))); | |
| 86 }, onError: (error) { | 99 }, onError: (error) { |
| 87 _lastUnexpectedError = error; | 100 _lastUnexpectedError = error; |
| 88 _resultsController.addError(error); | 101 _resultsController.addError(error); |
| 89 }); | 102 }); |
| 90 } | 103 } |
| 91 | 104 |
| 92 _errors = mergeStreams(_cascades.values.map((cascade) => cascade.errors), | 105 _errors = mergeStreams(_cascades.values.map((cascade) => cascade.errors), |
| 93 broadcast: true); | 106 broadcast: true); |
| 94 } | 107 } |
| 95 | 108 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 158 if (cascade == null) throw new ArgumentError("Unknown package $package."); | 171 if (cascade == null) throw new ArgumentError("Unknown package $package."); |
| 159 cascade.removeSources(ids); | 172 cascade.removeSources(ids); |
| 160 }); | 173 }); |
| 161 } | 174 } |
| 162 | 175 |
| 163 void updateTransformers(String package, | 176 void updateTransformers(String package, |
| 164 Iterable<Iterable<Transformer>> transformers) { | 177 Iterable<Iterable<Transformer>> transformers) { |
| 165 _cascades[package].updateTransformers(transformers); | 178 _cascades[package].updateTransformers(transformers); |
| 166 } | 179 } |
| 167 } | 180 } |
| OLD | NEW |