@@ -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,51 @@ 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 ;
103
+ final isError = message.severity == Severity .error;
98
104
for (final line in message.text.split ('\n ' )) {
99
105
result.add (
100
106
AnsiBufferLine ([
107
+ if (isError) AnsiBuffer .boldRed,
101
108
first ? message.severity.prefix : ' ' ,
109
+ if (isError) AnsiBuffer .reset,
102
110
line,
103
111
], hangingIndent: 2 ),
104
112
);
105
113
first = false ;
106
114
}
107
115
}
108
- return result;
116
+
117
+ return failed
118
+ ? RenderResult .failed (result)
119
+ : RenderResult .succeeded (result);
109
120
}
110
121
}
111
122
@@ -177,3 +188,24 @@ enum Severity {
177
188
Severity .error => 'E ' ,
178
189
};
179
190
}
191
+
192
+ class RenderResult {
193
+ /// Rendered messages block that does not contain any errors.
194
+ final List <AnsiBufferLine > nonFailureLines;
195
+
196
+ /// Rendered messages block that does contain errors.
197
+ final List <AnsiBufferLine > failureLines;
198
+
199
+ RenderResult () : nonFailureLines = [], failureLines = [];
200
+ RenderResult .failed (List <AnsiBufferLine > lines)
201
+ : failureLines = lines,
202
+ nonFailureLines = [];
203
+ RenderResult .succeeded (List <AnsiBufferLine > lines)
204
+ : nonFailureLines = lines,
205
+ failureLines = [];
206
+
207
+ void addAll (RenderResult other) {
208
+ nonFailureLines.addAll (other.nonFailureLines);
209
+ failureLines.addAll (other.failureLines);
210
+ }
211
+ }
0 commit comments