@@ -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,73 +147,102 @@ impl<'a, DB: WriteResults + Sync> Worker<'a, DB> {
148
147
149
148
info ! ( "{} processing crate {}" , self . name, krate) ;
150
149
151
- let mut did_prepare = false ;
152
- for tc in & self . ex . toolchains {
153
- let mut tasks = Vec :: new ( ) ;
150
+ if !self . ex . ignore_blacklist && self . config . should_skip ( & krate) {
151
+ for tc in & self . ex . toolchains {
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
+ }
154
171
155
- if !self . ex . ignore_blacklist && self . config . should_skip ( & krate) {
156
- tasks. push ( Task {
157
- krate : krate. clone ( ) ,
158
- step : TaskStep :: Skip { tc : tc. clone ( ) } ,
159
- } ) ;
160
- } else {
161
- if !did_prepare {
162
- did_prepare = true ;
163
- tasks. push ( Task {
164
- krate : krate. clone ( ) ,
165
- step : TaskStep :: Prepare ,
166
- } ) ;
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) ;
182
+ }
183
+ for tc in & self . ex . toolchains {
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) ;
167
197
}
168
- let quiet = self . config . is_quiet ( & krate) ;
169
- tasks. push ( Task {
170
- krate : krate. clone ( ) ,
171
- step : match self . ex . mode {
172
- Mode :: BuildOnly => TaskStep :: BuildOnly {
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 {
173
216
tc : tc. clone ( ) ,
174
217
quiet,
175
- } ,
176
- Mode :: BuildAndTest
177
- if !self . ex . ignore_blacklist
178
- && self . config . should_skip_tests ( & krate) =>
179
- {
180
- TaskStep :: BuildOnly {
181
- tc : tc. clone ( ) ,
182
- quiet,
183
- }
184
218
}
185
- Mode :: BuildAndTest => TaskStep :: BuildAndTest {
186
- tc : tc. clone ( ) ,
187
- quiet,
188
- } ,
189
- Mode :: CheckOnly => TaskStep :: CheckOnly {
190
- tc : tc. clone ( ) ,
191
- quiet,
192
- } ,
193
- Mode :: Clippy => TaskStep :: Clippy {
194
- tc : tc. clone ( ) ,
195
- quiet,
196
- } ,
197
- Mode :: Rustdoc => TaskStep :: Rustdoc {
198
- tc : tc. clone ( ) ,
199
- quiet,
200
- } ,
201
- Mode :: UnstableFeatures => TaskStep :: UnstableFeatures { tc : tc. clone ( ) } ,
219
+ }
220
+ Mode :: BuildAndTest => TaskStep :: BuildAndTest {
221
+ tc : tc. clone ( ) ,
222
+ quiet,
202
223
} ,
203
- } ) ;
204
- }
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
+ } ;
205
239
206
- let mut result = Ok ( ( ) ) ;
207
- let storage = LogStorage :: from ( self . config ) ;
208
- for task in tasks {
209
- if result. is_ok ( ) {
210
- result = self . run_task ( & task, & storage) ;
211
- }
212
- if let Err ( ( err, test_result) ) = & result {
213
- if let Err ( e) =
214
- task. mark_as_failed ( self . ex , self . db , err, test_result, & storage)
215
- {
216
- crate :: utils:: report_failure ( & e) ;
217
- }
240
+ let storage = logs. clone ( ) ;
241
+ if let Err ( ( err, test_result) ) = & self . run_task ( & task, & storage) {
242
+ if let Err ( e) =
243
+ task. mark_as_failed ( self . ex , self . db , err, test_result, & storage)
244
+ {
245
+ crate :: utils:: report_failure ( & e) ;
218
246
}
219
247
}
220
248
}
0 commit comments