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 |