@@ -92,8 +92,7 @@ impl<'a, DB: WriteResults + Sync> Worker<'a, DB> {
92
92
if res. is_err ( ) && self . ex . toolchains . len ( ) == 2 {
93
93
let toolchain = match & task. step {
94
94
TaskStep :: Prepare => None ,
95
- TaskStep :: Skip { tc }
96
- | TaskStep :: BuildAndTest { tc, .. }
95
+ TaskStep :: BuildAndTest { tc, .. }
97
96
| TaskStep :: BuildOnly { tc, .. }
98
97
| TaskStep :: CheckOnly { tc, .. }
99
98
| TaskStep :: Clippy { tc, .. }
@@ -148,67 +147,98 @@ impl<'a, DB: WriteResults + Sync> Worker<'a, DB> {
148
147
149
148
info ! ( "{} processing crate {}" , self . name, krate) ;
150
149
151
- let mut tasks = Vec :: new ( ) ;
152
-
153
150
if !self . ex . ignore_blacklist && self . config . should_skip ( & krate) {
154
151
for tc in & self . ex . toolchains {
155
- tasks. push ( Task {
156
- krate : krate. clone ( ) ,
157
- step : TaskStep :: Skip { tc : tc. clone ( ) } ,
158
- } ) ;
152
+ // If a skipped crate is somehow sent to the agent (for example, when a crate was
153
+ // added to the experiment and *then* blacklisted) report the crate as skipped
154
+ // instead of silently ignoring it.
155
+ if let Err ( e) = self . db . record_result (
156
+ self . ex ,
157
+ tc,
158
+ & krate,
159
+ & LogStorage :: from ( self . config ) ,
160
+ crate :: results:: EncodingType :: Plain ,
161
+ || {
162
+ warn ! ( "crate skipped" ) ;
163
+ Ok ( TestResult :: Skipped )
164
+ } ,
165
+ ) {
166
+ crate :: utils:: report_failure ( & e) ;
167
+ }
168
+ }
169
+ continue ;
170
+ }
171
+
172
+ let logs = LogStorage :: from ( self . config ) ;
173
+ let prepare_task = Task {
174
+ krate : krate. clone ( ) ,
175
+ step : TaskStep :: Prepare ,
176
+ } ;
177
+ if let Err ( ( err, test_result) ) = & self . run_task ( & prepare_task, & logs) {
178
+ if let Err ( e) =
179
+ prepare_task. mark_as_failed ( self . ex , self . db , err, test_result, & logs)
180
+ {
181
+ crate :: utils:: report_failure ( & e) ;
159
182
}
160
- } else {
161
- tasks. push ( Task {
162
- krate : krate. clone ( ) ,
163
- step : TaskStep :: Prepare ,
164
- } ) ;
165
- let quiet = self . config . is_quiet ( & krate) ;
166
183
for tc in & self . ex . toolchains {
167
- tasks. push ( Task {
168
- krate : krate. clone ( ) ,
169
- step : match self . ex . mode {
170
- Mode :: BuildOnly => TaskStep :: BuildOnly {
184
+ if let Err ( e) = self . db . record_result (
185
+ self . ex ,
186
+ tc,
187
+ & krate,
188
+ & LogStorage :: from ( self . config ) ,
189
+ crate :: results:: EncodingType :: Plain ,
190
+ || {
191
+ error ! ( "this task or one of its parent failed!" ) ;
192
+ utils:: report_failure ( err) ;
193
+ Ok ( test_result. clone ( ) )
194
+ } ,
195
+ ) {
196
+ crate :: utils:: report_failure ( & e) ;
197
+ }
198
+ }
199
+ continue ;
200
+ }
201
+
202
+ for tc in & self . ex . toolchains {
203
+ let quiet = self . config . is_quiet ( & krate) ;
204
+ let task = Task {
205
+ krate : krate. clone ( ) ,
206
+ step : match self . ex . mode {
207
+ Mode :: BuildOnly => TaskStep :: BuildOnly {
208
+ tc : tc. clone ( ) ,
209
+ quiet,
210
+ } ,
211
+ Mode :: BuildAndTest
212
+ if !self . ex . ignore_blacklist
213
+ && self . config . should_skip_tests ( & krate) =>
214
+ {
215
+ TaskStep :: BuildOnly {
171
216
tc : tc. clone ( ) ,
172
217
quiet,
173
- } ,
174
- Mode :: BuildAndTest
175
- if !self . ex . ignore_blacklist
176
- && self . config . should_skip_tests ( & krate) =>
177
- {
178
- TaskStep :: BuildOnly {
179
- tc : tc. clone ( ) ,
180
- quiet,
181
- }
182
218
}
183
- Mode :: BuildAndTest => TaskStep :: BuildAndTest {
184
- tc : tc. clone ( ) ,
185
- quiet,
186
- } ,
187
- Mode :: CheckOnly => TaskStep :: CheckOnly {
188
- tc : tc. clone ( ) ,
189
- quiet,
190
- } ,
191
- Mode :: Clippy => TaskStep :: Clippy {
192
- tc : tc. clone ( ) ,
193
- quiet,
194
- } ,
195
- Mode :: Rustdoc => TaskStep :: Rustdoc {
196
- tc : tc. clone ( ) ,
197
- quiet,
198
- } ,
199
- Mode :: UnstableFeatures => TaskStep :: UnstableFeatures { tc : tc. clone ( ) } ,
219
+ }
220
+ Mode :: BuildAndTest => TaskStep :: BuildAndTest {
221
+ tc : tc. clone ( ) ,
222
+ quiet,
200
223
} ,
201
- } ) ;
202
- }
203
- }
224
+ Mode :: CheckOnly => TaskStep :: CheckOnly {
225
+ tc : tc. clone ( ) ,
226
+ quiet,
227
+ } ,
228
+ Mode :: Clippy => TaskStep :: Clippy {
229
+ tc : tc. clone ( ) ,
230
+ quiet,
231
+ } ,
232
+ Mode :: Rustdoc => TaskStep :: Rustdoc {
233
+ tc : tc. clone ( ) ,
234
+ quiet,
235
+ } ,
236
+ Mode :: UnstableFeatures => TaskStep :: UnstableFeatures { tc : tc. clone ( ) } ,
237
+ } ,
238
+ } ;
204
239
205
- let mut result = Ok ( ( ) ) ;
206
- let storage = LogStorage :: from ( self . config ) ;
207
- for task in tasks {
208
- if result. is_ok ( ) {
209
- result = self . run_task ( & task, & storage) ;
210
- }
211
- if let Err ( ( err, test_result) ) = & result {
240
+ let storage = logs. clone ( ) ;
241
+ if let Err ( ( err, test_result) ) = & self . run_task ( & task, & storage) {
212
242
if let Err ( e) =
213
243
task. mark_as_failed ( self . ex , self . db , err, test_result, & storage)
214
244
{
0 commit comments