@@ -6,11 +6,12 @@ use crate::runner::tasks::TaskCtx;
66use crate :: runner:: OverrideResult ;
77use cargo_metadata:: diagnostic:: DiagnosticLevel ;
88use cargo_metadata:: { Message , Metadata , PackageId } ;
9+ use docsrs_metadata:: Metadata as DocsrsMetadata ;
910use failure:: Error ;
1011use remove_dir_all:: remove_dir_all;
1112use rustwide:: cmd:: { CommandError , ProcessLinesActions , SandboxBuilder } ;
1213use rustwide:: { Build , PrepareError } ;
13- use std:: collections:: { BTreeSet , HashSet } ;
14+ use std:: collections:: { BTreeSet , HashMap , HashSet } ;
1415use std:: convert:: TryFrom ;
1516
1617fn failure_reason ( err : & Error ) -> FailureReason {
@@ -83,6 +84,7 @@ fn run_cargo<DB: WriteResults>(
8384 args : & [ & str ] ,
8485 check_errors : bool ,
8586 local_packages_id : & HashSet < PackageId > ,
87+ env : HashMap < & ' static str , String > ,
8688) -> Fallible < ( ) > {
8789 let mut rustflags = format ! ( "--cap-lints={}" , ctx. experiment. cap_lints. to_str( ) ) ;
8890 if let Some ( ref tc_rustflags) = ctx. toolchain . rustflags {
@@ -151,6 +153,9 @@ fn run_cargo<DB: WriteResults>(
151153 . env ( "CARGO_INCREMENTAL" , "0" )
152154 . env ( "RUST_BACKTRACE" , "full" )
153155 . env ( rustflags_env, rustflags) ;
156+ for ( var, data) in env {
157+ command = command. env ( var, data) ;
158+ }
154159
155160 if check_errors {
156161 command = command. process_lines ( & mut detect_error) ;
@@ -241,13 +246,15 @@ fn build<DB: WriteResults>(
241246 & [ "build" , "--frozen" , "--message-format=json" ] ,
242247 true ,
243248 local_packages_id,
249+ HashMap :: default ( ) ,
244250 ) ?;
245251 run_cargo (
246252 ctx,
247253 build_env,
248254 & [ "test" , "--frozen" , "--no-run" , "--message-format=json" ] ,
249255 true ,
250256 local_packages_id,
257+ HashMap :: default ( ) ,
251258 ) ?;
252259 Ok ( ( ) )
253260}
@@ -259,6 +266,7 @@ fn test<DB: WriteResults>(ctx: &TaskCtx<DB>, build_env: &Build) -> Fallible<()>
259266 & [ "test" , "--frozen" ] ,
260267 false ,
261268 & HashSet :: new ( ) ,
269+ HashMap :: default ( ) ,
262270 )
263271}
264272
@@ -311,6 +319,7 @@ pub(super) fn test_check_only<DB: WriteResults>(
311319 ] ,
312320 true ,
313321 local_packages_id,
322+ HashMap :: default ( ) ,
314323 ) {
315324 Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
316325 } else {
@@ -335,6 +344,7 @@ pub(super) fn test_clippy_only<DB: WriteResults>(
335344 ] ,
336345 true ,
337346 local_packages_id,
347+ HashMap :: default ( ) ,
338348 ) {
339349 Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
340350 } else {
@@ -359,6 +369,7 @@ pub(super) fn test_rustdoc<DB: WriteResults>(
359369 ] ,
360370 true ,
361371 local_packages_id,
372+ HashMap :: new ( ) ,
362373 ) ;
363374
364375 // Make sure to remove the built documentation
@@ -371,3 +382,40 @@ pub(super) fn test_rustdoc<DB: WriteResults>(
371382 Ok ( TestResult :: TestPass )
372383 }
373384}
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