@@ -20,10 +20,12 @@ import '../asset/writer.dart';
20
20
import '../asset_graph/graph.dart' ;
21
21
import '../asset_graph/node.dart' ;
22
22
import '../asset_graph/optional_output_tracker.dart' ;
23
+ import '../changes/asset_updates.dart' ;
23
24
import '../environment/build_environment.dart' ;
24
25
import '../logging/build_for_input_logger.dart' ;
25
26
import '../logging/failure_reporter.dart' ;
26
27
import '../logging/human_readable_duration.dart' ;
28
+ import '../logging/log_renderer.dart' ;
27
29
import '../logging/logging.dart' ;
28
30
import '../performance_tracking/performance_tracking_resolvers.dart' ;
29
31
import '../util/build_dirs.dart' ;
@@ -56,8 +58,10 @@ class Build {
56
58
final RunnerAssetWriter deleteWriter;
57
59
58
60
// Logging.
59
- final BuildPerformanceTracker _performanceTracker;
61
+ final LogRenderer renderer;
62
+ final BuildPerformanceTracker performanceTracker;
60
63
late final HungActionsHeartbeat hungActionsHeartbeat;
64
+ final bool logFine;
61
65
62
66
// State.
63
67
final AssetGraph assetGraph;
@@ -78,10 +82,12 @@ class Build {
78
82
required this .deleteWriter,
79
83
required this .resourceManager,
80
84
required this .assetGraph,
81
- }) : _performanceTracker =
85
+ }) : renderer = LogRenderer (rootPackageName: options.packageGraph.root.name),
86
+ performanceTracker =
82
87
options.trackPerformance
83
88
? BuildPerformanceTracker ()
84
- : BuildPerformanceTracker .noOp () {
89
+ : BuildPerformanceTracker .noOp (),
90
+ logFine = _logger.level <= Level .FINE {
85
91
hungActionsHeartbeat = HungActionsHeartbeat (() {
86
92
final message = StringBuffer ();
87
93
const actionsToLogMax = 5 ;
@@ -101,6 +107,10 @@ class Build {
101
107
}
102
108
103
109
Future <BuildResult > run (Map <AssetId , ChangeType > updates) async {
110
+ if (logFine) {
111
+ _logger.fine (AssetUpdates .from (updates).render (renderer));
112
+ }
113
+
104
114
var watch = Stopwatch ()..start ();
105
115
var result = await _safeBuild (updates);
106
116
var optionalOutputTracker = OptionalOutputTracker (
@@ -164,7 +174,6 @@ class Build {
164
174
/// capturing.
165
175
Future <BuildResult > _safeBuild (Map <AssetId , ChangeType > updates) {
166
176
var done = Completer <BuildResult >();
167
-
168
177
var heartbeat = HeartbeatLogger (
169
178
transformLog: (original) => '$original , ${_buildProgress ()}' ,
170
179
waitDuration: const Duration (seconds: 1 ),
@@ -238,13 +247,13 @@ class Build {
238
247
/// Runs the actions in [buildPhases] and returns a future which completes
239
248
/// to the [BuildResult] once all [BuildPhase] s are done.
240
249
Future <BuildResult > _runPhases () {
241
- return _performanceTracker .track (() async {
250
+ return performanceTracker .track (() async {
242
251
final outputs = < AssetId > [];
243
252
for (var phaseNum = 0 ; phaseNum < buildPhases.length; phaseNum++ ) {
244
253
var phase = buildPhases[phaseNum];
245
254
if (phase.isOptional) continue ;
246
255
outputs.addAll (
247
- await _performanceTracker .trackBuildPhase (phase, () async {
256
+ await performanceTracker .trackBuildPhase (phase, () async {
248
257
if (phase is InBuildPhase ) {
249
258
var primaryInputs = await _matchingPrimaryInputs (
250
259
phase.package,
@@ -268,7 +277,7 @@ class Build {
268
277
return BuildResult (
269
278
BuildStatus .success,
270
279
outputs,
271
- performance: _performanceTracker ,
280
+ performance: performanceTracker ,
272
281
);
273
282
});
274
283
}
@@ -392,7 +401,7 @@ class Build {
392
401
AssetId input,
393
402
) async {
394
403
final builder = phase.builder;
395
- var tracker = _performanceTracker .addBuilderAction (
404
+ var tracker = performanceTracker .addBuilderAction (
396
405
input,
397
406
phase.builderLabel,
398
407
);
@@ -433,7 +442,7 @@ class Build {
433
442
434
443
if (! await tracker.trackStage (
435
444
'Setup' ,
436
- () => _buildShouldRun (builderOutputs, readerWriter),
445
+ () => _buildShouldRun (input, builderOutputs, readerWriter),
437
446
)) {
438
447
return < AssetId > [];
439
448
}
@@ -667,6 +676,7 @@ class Build {
667
676
668
677
/// Checks and returns whether any [outputs] need to be updated.
669
678
Future <bool > _buildShouldRun (
679
+ AssetId input,
670
680
Iterable <AssetId > outputs,
671
681
AssetReader reader,
672
682
) async {
@@ -682,6 +692,12 @@ class Build {
682
692
for (var output in outputs.skip (1 )) {
683
693
if (assetGraph.get (output)! .generatedNodeState! .pendingBuildAction ==
684
694
PendingBuildAction .build) {
695
+ if (logFine) {
696
+ _logger.fine (
697
+ 'Build ${renderer .build (input , outputs )} because '
698
+ '${renderer .id (output )} was marked for build.' ,
699
+ );
700
+ }
685
701
return true ;
686
702
}
687
703
}
@@ -713,19 +729,48 @@ class Build {
713
729
714
730
// Early bail out condition, this is a forced update.
715
731
if (firstNodeState.pendingBuildAction == PendingBuildAction .build) {
732
+ if (logFine) {
733
+ _logger.fine (
734
+ 'Build ${renderer .build (input , outputs )} because '
735
+ '${renderer .id (firstNode .id )} was marked for build.' ,
736
+ );
737
+ }
716
738
return true ;
717
739
}
718
740
// This is a fresh build or the first time we've seen this output.
719
- if (firstNodeState.previousInputsDigest == null ) return true ;
741
+ if (firstNodeState.previousInputsDigest == null ) {
742
+ if (logFine) {
743
+ _logger.fine (
744
+ 'Build ${renderer .build (input , outputs )} because '
745
+ '${renderer .id (firstNode .id )} has no previousInputsDigest.' ,
746
+ );
747
+ }
748
+ return true ;
749
+ }
720
750
721
751
var digest = await _computeCombinedDigest (
722
752
firstNodeState.inputs,
723
753
firstNode.generatedNodeConfiguration! .builderOptionsId,
724
754
reader,
725
755
);
726
756
if (digest != firstNodeState.previousInputsDigest) {
757
+ if (logFine) {
758
+ _logger.fine (
759
+ 'Build ${renderer .build (input , outputs )} because '
760
+ 'inputs digest changed '
761
+ 'from ${renderer .digest (firstNodeState .previousInputsDigest )} '
762
+ 'to ${renderer .digest (digest )}.' ,
763
+ );
764
+ }
727
765
return true ;
728
766
} else {
767
+ if (logFine) {
768
+ _logger.fine (
769
+ 'Skip bulding ${renderer .build (input , outputs )} because '
770
+ 'inputs digest is still '
771
+ '${renderer .digest (firstNodeState .previousInputsDigest )}.' ,
772
+ );
773
+ }
729
774
// Make sure to update the `state` field for all outputs.
730
775
for (var id in outputs) {
731
776
assetGraph.updateNode (id, (nodeBuilder) {
0 commit comments