@@ -51,8 +51,8 @@ class BuildLogMessages {
51
51
bool hasMessages ({required String ? phaseName}) =>
52
52
_phaseNamesWithMessages.contains (phaseName);
53
53
54
- List < AnsiBufferLine > render () {
55
- final result = < AnsiBufferLine > [] ;
54
+ RenderResult render () {
55
+ final result = RenderResult () ;
56
56
57
57
final buildRunnerCategories = < MapEntry <_MessageCategory , List <Message >>> [];
58
58
for (final entry in _messageByCategory.entries) {
@@ -72,40 +72,50 @@ class BuildLogMessages {
72
72
return result;
73
73
}
74
74
75
- List < AnsiBufferLine > _renderCategory (
75
+ RenderResult _renderCategory (
76
76
MapEntry <_MessageCategory , List <Message >> entry,
77
77
) {
78
- final result = < AnsiBufferLine > [];
79
78
final category = entry.key;
80
79
final context = category.context;
80
+
81
+ final messages = _messageByCategory[category]! ;
82
+ final failed = messages.any (
83
+ (message) => message.severity == Severity .error,
84
+ );
85
+
86
+ final result = < AnsiBufferLine > [];
81
87
result.add (
82
88
AnsiBufferLine ([
83
- 'log output for ' ,
84
- AnsiBuffer .bold,
85
- category.phaseName ?? 'build_runner' ,
86
- AnsiBuffer .reset,
87
89
if (context != null ) ...[
88
- ' on ' ,
89
- AnsiBuffer .bold,
90
+ failed ? AnsiBuffer .boldRed : AnsiBuffer .bold,
90
91
context,
91
92
AnsiBuffer .reset,
93
+ ' ' ,
92
94
],
95
+ AnsiBuffer .bold,
96
+ category.phaseName ?? 'build_runner' ,
97
+ AnsiBuffer .reset,
93
98
]),
94
99
);
95
100
96
- for (final message in _messageByCategory[category] ! ) {
101
+ for (final message in messages ) {
97
102
var first = true ;
98
103
for (final line in message.text.split ('\n ' )) {
99
104
result.add (
100
105
AnsiBufferLine ([
106
+ if (message.severity == Severity .error) AnsiBuffer .boldRed,
101
107
first ? message.severity.prefix : ' ' ,
108
+ if (message.severity == Severity .error) AnsiBuffer .reset,
102
109
line,
103
110
], hangingIndent: 2 ),
104
111
);
105
112
first = false ;
106
113
}
107
114
}
108
- return result;
115
+
116
+ return failed
117
+ ? RenderResult .failed (result)
118
+ : RenderResult .succeeded (result);
109
119
}
110
120
}
111
121
@@ -177,3 +187,24 @@ enum Severity {
177
187
Severity .error => 'E ' ,
178
188
};
179
189
}
190
+
191
+ class RenderResult {
192
+ /// Rendered messages block that does not contain any errors.
193
+ final List <AnsiBufferLine > nonFailureLines;
194
+
195
+ /// Rendered messages block that does contain errors.
196
+ final List <AnsiBufferLine > failureLines;
197
+
198
+ RenderResult () : nonFailureLines = [], failureLines = [];
199
+ RenderResult .failed (List <AnsiBufferLine > lines)
200
+ : failureLines = lines,
201
+ nonFailureLines = [];
202
+ RenderResult .succeeded (List <AnsiBufferLine > lines)
203
+ : nonFailureLines = lines,
204
+ failureLines = [];
205
+
206
+ void addAll (RenderResult other) {
207
+ nonFailureLines.addAll (other.nonFailureLines);
208
+ failureLines.addAll (other.failureLines);
209
+ }
210
+ }
0 commit comments