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