11use crate :: crates:: Crate ;
2+ use crate :: experiments:: CapLints ;
23use crate :: prelude:: * ;
34use crate :: results:: DiagnosticCode ;
45use crate :: results:: { BrokenReason , FailureReason , TestResult } ;
@@ -9,7 +10,7 @@ use cargo_metadata::diagnostic::DiagnosticLevel;
910use cargo_metadata:: { Message , Metadata , Package , Target } ;
1011use docsrs_metadata:: Metadata as DocsrsMetadata ;
1112use remove_dir_all:: remove_dir_all;
12- use rustwide:: cmd:: { CommandError , ProcessLinesActions , SandboxBuilder } ;
13+ use rustwide:: cmd:: { CommandError , MountKind , ProcessLinesActions , SandboxBuilder } ;
1314use rustwide:: logging:: LogStorage ;
1415use rustwide:: { Build , PrepareError } ;
1516use std:: collections:: { BTreeSet , HashMap , HashSet } ;
@@ -89,6 +90,8 @@ fn run_cargo(
8990 check_errors : bool ,
9091 local_packages : & [ Package ] ,
9192 env : HashMap < & ' static str , String > ,
93+ mount_kind : MountKind ,
94+ cap_lints : Option < CapLints > ,
9295) -> Fallible < ( ) > {
9396 let local_packages_id: HashSet < _ > = local_packages. iter ( ) . map ( |p| & p. id ) . collect ( ) ;
9497
@@ -100,13 +103,17 @@ fn run_cargo(
100103 args. extend ( tc_cargoflags. split ( ' ' ) ) ;
101104 }
102105
103- let mut rustflags = format ! ( "--cap-lints={}" , ctx. experiment. cap_lints. to_str( ) ) ;
106+ let mut rustflags = cap_lints
107+ . map ( |cap| format ! ( "--cap-lints={cap}" ) )
108+ . unwrap_or_default ( ) ;
104109 if let Some ( ref tc_rustflags) = ctx. toolchain . rustflags {
105110 rustflags. push ( ' ' ) ;
106111 rustflags. push_str ( tc_rustflags) ;
107112 }
108113
109- let mut rustdocflags = format ! ( "--cap-lints={}" , ctx. experiment. cap_lints. to_str( ) ) ;
114+ let mut rustdocflags = cap_lints
115+ . map ( |cap| format ! ( "--cap-lints={cap}" ) )
116+ . unwrap_or_default ( ) ;
110117 if let Some ( ref tc_rustdocflags) = ctx. toolchain . rustdocflags {
111118 rustdocflags. push ( ' ' ) ;
112119 rustdocflags. push_str ( tc_rustdocflags) ;
@@ -187,6 +194,7 @@ fn run_cargo(
187194 let mut command = build_env
188195 . cargo ( )
189196 . args ( & args)
197+ . source_dir_mount_kind ( mount_kind)
190198 . env ( "CARGO_INCREMENTAL" , "0" )
191199 . env ( "RUST_BACKTRACE" , "full" )
192200 . env ( "RUSTFLAGS" , rustflags)
@@ -263,6 +271,8 @@ fn build(ctx: &TaskCtx, build_env: &Build, local_packages: &[Package]) -> Fallib
263271 true ,
264272 local_packages,
265273 HashMap :: default ( ) ,
274+ MountKind :: ReadOnly ,
275+ Some ( ctx. experiment . cap_lints ) ,
266276 ) ?;
267277 run_cargo (
268278 ctx,
@@ -271,6 +281,8 @@ fn build(ctx: &TaskCtx, build_env: &Build, local_packages: &[Package]) -> Fallib
271281 true ,
272282 local_packages,
273283 HashMap :: default ( ) ,
284+ MountKind :: ReadOnly ,
285+ Some ( ctx. experiment . cap_lints ) ,
274286 ) ?;
275287 Ok ( ( ) )
276288}
@@ -283,6 +295,8 @@ fn test(ctx: &TaskCtx, build_env: &Build) -> Fallible<()> {
283295 false ,
284296 & [ ] ,
285297 HashMap :: default ( ) ,
298+ MountKind :: ReadOnly ,
299+ Some ( ctx. experiment . cap_lints ) ,
286300 )
287301}
288302
@@ -336,6 +350,8 @@ pub(super) fn test_check_only(
336350 true ,
337351 local_packages_id,
338352 HashMap :: default ( ) ,
353+ MountKind :: ReadOnly ,
354+ Some ( ctx. experiment . cap_lints ) ,
339355 ) {
340356 Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
341357 } else {
@@ -361,6 +377,8 @@ pub(super) fn test_clippy_only(
361377 true ,
362378 local_packages,
363379 HashMap :: default ( ) ,
380+ MountKind :: ReadOnly ,
381+ Some ( ctx. experiment . cap_lints ) ,
364382 ) {
365383 Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
366384 } else {
@@ -374,7 +392,16 @@ pub(super) fn test_rustdoc(
374392 local_packages : & [ Package ] ,
375393) -> Fallible < TestResult > {
376394 let run = |cargo_args, env| {
377- let res = run_cargo ( ctx, build_env, cargo_args, true , local_packages, env) ;
395+ let res = run_cargo (
396+ ctx,
397+ build_env,
398+ cargo_args,
399+ true ,
400+ local_packages,
401+ env,
402+ MountKind :: ReadOnly ,
403+ Some ( ctx. experiment . cap_lints ) ,
404+ ) ;
378405
379406 // Make sure to remove the built documentation
380407 // There is no point in storing it after the build is done
@@ -433,6 +460,35 @@ fn is_library(target: &Target) -> bool {
433460 . all ( |k| ![ "example" , "test" , "bench" ] . contains ( & k. as_str ( ) ) )
434461}
435462
463+ pub ( crate ) fn fix (
464+ ctx : & TaskCtx ,
465+ build_env : & Build ,
466+ local_packages_id : & [ Package ] ,
467+ ) -> Fallible < TestResult > {
468+ if let Err ( err) = run_cargo (
469+ ctx,
470+ build_env,
471+ & [
472+ "fix" ,
473+ "--allow-no-vcs" ,
474+ "--allow-dirty" ,
475+ "--frozen" ,
476+ "--all" ,
477+ "--all-targets" ,
478+ "--message-format=json" ,
479+ ] ,
480+ true ,
481+ local_packages_id,
482+ HashMap :: default ( ) ,
483+ MountKind :: ReadWrite ,
484+ None ,
485+ ) {
486+ Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
487+ } else {
488+ Ok ( TestResult :: TestPass )
489+ }
490+ }
491+
436492#[ test]
437493fn test_failure_reason ( ) {
438494 let error: anyhow:: Error = anyhow ! ( CommandError :: IO ( std:: io:: Error :: other( "Test" ) ) ) ;
0 commit comments