@@ -6,11 +6,12 @@ use crate::runner::tasks::TaskCtx;
6
6
use crate :: runner:: OverrideResult ;
7
7
use cargo_metadata:: diagnostic:: DiagnosticLevel ;
8
8
use cargo_metadata:: { Message , Metadata , PackageId } ;
9
+ use docsrs_metadata:: Metadata as DocsrsMetadata ;
9
10
use failure:: Error ;
10
11
use remove_dir_all:: remove_dir_all;
11
12
use rustwide:: cmd:: { CommandError , ProcessLinesActions , SandboxBuilder } ;
12
13
use rustwide:: { Build , PrepareError } ;
13
- use std:: collections:: { BTreeSet , HashSet } ;
14
+ use std:: collections:: { BTreeSet , HashMap , HashSet } ;
14
15
use std:: convert:: TryFrom ;
15
16
16
17
fn failure_reason ( err : & Error ) -> FailureReason {
@@ -83,6 +84,7 @@ fn run_cargo<DB: WriteResults>(
83
84
args : & [ & str ] ,
84
85
check_errors : bool ,
85
86
local_packages_id : & HashSet < PackageId > ,
87
+ env : HashMap < & ' static str , String > ,
86
88
) -> Fallible < ( ) > {
87
89
let mut rustflags = format ! ( "--cap-lints={}" , ctx. experiment. cap_lints. to_str( ) ) ;
88
90
if let Some ( ref tc_rustflags) = ctx. toolchain . rustflags {
@@ -151,6 +153,9 @@ fn run_cargo<DB: WriteResults>(
151
153
. env ( "CARGO_INCREMENTAL" , "0" )
152
154
. env ( "RUST_BACKTRACE" , "full" )
153
155
. env ( rustflags_env, rustflags) ;
156
+ for ( var, data) in env {
157
+ command = command. env ( var, data) ;
158
+ }
154
159
155
160
if check_errors {
156
161
command = command. process_lines ( & mut detect_error) ;
@@ -241,13 +246,15 @@ fn build<DB: WriteResults>(
241
246
& [ "build" , "--frozen" , "--message-format=json" ] ,
242
247
true ,
243
248
local_packages_id,
249
+ HashMap :: default ( ) ,
244
250
) ?;
245
251
run_cargo (
246
252
ctx,
247
253
build_env,
248
254
& [ "test" , "--frozen" , "--no-run" , "--message-format=json" ] ,
249
255
true ,
250
256
local_packages_id,
257
+ HashMap :: default ( ) ,
251
258
) ?;
252
259
Ok ( ( ) )
253
260
}
@@ -259,6 +266,7 @@ fn test<DB: WriteResults>(ctx: &TaskCtx<DB>, build_env: &Build) -> Fallible<()>
259
266
& [ "test" , "--frozen" ] ,
260
267
false ,
261
268
& HashSet :: new ( ) ,
269
+ HashMap :: default ( ) ,
262
270
)
263
271
}
264
272
@@ -311,6 +319,7 @@ pub(super) fn test_check_only<DB: WriteResults>(
311
319
] ,
312
320
true ,
313
321
local_packages_id,
322
+ HashMap :: default ( ) ,
314
323
) {
315
324
Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
316
325
} else {
@@ -335,6 +344,7 @@ pub(super) fn test_clippy_only<DB: WriteResults>(
335
344
] ,
336
345
true ,
337
346
local_packages_id,
347
+ HashMap :: default ( ) ,
338
348
) {
339
349
Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
340
350
} else {
@@ -359,6 +369,7 @@ pub(super) fn test_rustdoc<DB: WriteResults>(
359
369
] ,
360
370
true ,
361
371
local_packages_id,
372
+ HashMap :: new ( ) ,
362
373
) ;
363
374
364
375
// Make sure to remove the built documentation
@@ -371,3 +382,40 @@ pub(super) fn test_rustdoc<DB: WriteResults>(
371
382
Ok ( TestResult :: TestPass )
372
383
}
373
384
}
385
+
386
+ pub ( super ) fn test_rustdoc_with_metadata < DB : WriteResults > (
387
+ ctx : & TaskCtx < DB > ,
388
+ build_env : & Build ,
389
+ local_packages_id : & HashSet < PackageId > ,
390
+ ) -> Fallible < TestResult > {
391
+ let src = build_env. host_source_dir ( ) ;
392
+ let metadata = DocsrsMetadata :: from_crate_root ( src) ?;
393
+ let cargo_args = metadata. cargo_args (
394
+ & [
395
+ "--frozen" . into ( ) ,
396
+ "--no-deps" . into ( ) ,
397
+ "--document-private-items" . into ( ) ,
398
+ "--message-format=json" . into ( ) ,
399
+ ] ,
400
+ & [ ] ,
401
+ ) ;
402
+ assert_eq ! ( cargo_args[ 0 ] , "rustdoc" ) ;
403
+ let cargo_args: Vec < _ > = cargo_args. iter ( ) . map ( |s| s. as_str ( ) ) . collect ( ) ;
404
+ let mut env = metadata. environment_variables ( ) ;
405
+ // docsrs-metadata requires a nightly environment, but crater sometimes runs tests on beta and
406
+ // stable.
407
+ // TODO: only allow this for the crate currently being built?
408
+ env. insert ( "RUSTC_BOOTSTRAP" , "1" . to_string ( ) ) ;
409
+
410
+ let res = run_cargo ( ctx, build_env, & cargo_args, true , local_packages_id, env) ;
411
+
412
+ // Make sure to remove the built documentation
413
+ // There is no point in storing it after the build is done
414
+ remove_dir_all ( & build_env. host_target_dir ( ) . join ( "doc" ) ) ?;
415
+
416
+ if let Err ( err) = res {
417
+ Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
418
+ } else {
419
+ Ok ( TestResult :: TestPass )
420
+ }
421
+ }
0 commit comments