1
1
use crate :: crates:: Crate ;
2
+ use crate :: experiments:: CapLints ;
2
3
use crate :: prelude:: * ;
3
4
use crate :: results:: DiagnosticCode ;
4
5
use crate :: results:: { BrokenReason , FailureReason , TestResult } ;
@@ -9,7 +10,7 @@ use cargo_metadata::diagnostic::DiagnosticLevel;
9
10
use cargo_metadata:: { Message , Metadata , Package , Target } ;
10
11
use docsrs_metadata:: Metadata as DocsrsMetadata ;
11
12
use remove_dir_all:: remove_dir_all;
12
- use rustwide:: cmd:: { CommandError , ProcessLinesActions , SandboxBuilder } ;
13
+ use rustwide:: cmd:: { CommandError , MountKind , ProcessLinesActions , SandboxBuilder } ;
13
14
use rustwide:: logging:: LogStorage ;
14
15
use rustwide:: { Build , PrepareError } ;
15
16
use std:: collections:: { BTreeSet , HashMap , HashSet } ;
@@ -89,6 +90,8 @@ fn run_cargo(
89
90
check_errors : bool ,
90
91
local_packages : & [ Package ] ,
91
92
env : HashMap < & ' static str , String > ,
93
+ mount_kind : MountKind ,
94
+ cap_lints : Option < CapLints > ,
92
95
) -> Fallible < ( ) > {
93
96
let local_packages_id: HashSet < _ > = local_packages. iter ( ) . map ( |p| & p. id ) . collect ( ) ;
94
97
@@ -100,13 +103,17 @@ fn run_cargo(
100
103
args. extend ( tc_cargoflags. split ( ' ' ) ) ;
101
104
}
102
105
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 ( ) ;
104
109
if let Some ( ref tc_rustflags) = ctx. toolchain . rustflags {
105
110
rustflags. push ( ' ' ) ;
106
111
rustflags. push_str ( tc_rustflags) ;
107
112
}
108
113
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 ( ) ;
110
117
if let Some ( ref tc_rustdocflags) = ctx. toolchain . rustdocflags {
111
118
rustdocflags. push ( ' ' ) ;
112
119
rustdocflags. push_str ( tc_rustdocflags) ;
@@ -187,6 +194,7 @@ fn run_cargo(
187
194
let mut command = build_env
188
195
. cargo ( )
189
196
. args ( & args)
197
+ . source_dir_mount_kind ( mount_kind)
190
198
. env ( "CARGO_INCREMENTAL" , "0" )
191
199
. env ( "RUST_BACKTRACE" , "full" )
192
200
. env ( "RUSTFLAGS" , rustflags)
@@ -263,6 +271,8 @@ fn build(ctx: &TaskCtx, build_env: &Build, local_packages: &[Package]) -> Fallib
263
271
true ,
264
272
local_packages,
265
273
HashMap :: default ( ) ,
274
+ MountKind :: ReadOnly ,
275
+ Some ( ctx. experiment . cap_lints ) ,
266
276
) ?;
267
277
run_cargo (
268
278
ctx,
@@ -271,6 +281,8 @@ fn build(ctx: &TaskCtx, build_env: &Build, local_packages: &[Package]) -> Fallib
271
281
true ,
272
282
local_packages,
273
283
HashMap :: default ( ) ,
284
+ MountKind :: ReadOnly ,
285
+ Some ( ctx. experiment . cap_lints ) ,
274
286
) ?;
275
287
Ok ( ( ) )
276
288
}
@@ -283,6 +295,8 @@ fn test(ctx: &TaskCtx, build_env: &Build) -> Fallible<()> {
283
295
false ,
284
296
& [ ] ,
285
297
HashMap :: default ( ) ,
298
+ MountKind :: ReadOnly ,
299
+ Some ( ctx. experiment . cap_lints ) ,
286
300
)
287
301
}
288
302
@@ -336,6 +350,8 @@ pub(super) fn test_check_only(
336
350
true ,
337
351
local_packages_id,
338
352
HashMap :: default ( ) ,
353
+ MountKind :: ReadOnly ,
354
+ Some ( ctx. experiment . cap_lints ) ,
339
355
) {
340
356
Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
341
357
} else {
@@ -361,6 +377,8 @@ pub(super) fn test_clippy_only(
361
377
true ,
362
378
local_packages,
363
379
HashMap :: default ( ) ,
380
+ MountKind :: ReadOnly ,
381
+ Some ( ctx. experiment . cap_lints ) ,
364
382
) {
365
383
Ok ( TestResult :: BuildFail ( failure_reason ( & err) ) )
366
384
} else {
@@ -374,7 +392,16 @@ pub(super) fn test_rustdoc(
374
392
local_packages : & [ Package ] ,
375
393
) -> Fallible < TestResult > {
376
394
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
+ ) ;
378
405
379
406
// Make sure to remove the built documentation
380
407
// There is no point in storing it after the build is done
@@ -433,6 +460,35 @@ fn is_library(target: &Target) -> bool {
433
460
. all ( |k| ![ "example" , "test" , "bench" ] . contains ( & k. as_str ( ) ) )
434
461
}
435
462
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
+
436
492
#[ test]
437
493
fn test_failure_reason ( ) {
438
494
let error: anyhow:: Error = anyhow ! ( CommandError :: IO ( std:: io:: Error :: other( "Test" ) ) ) ;
0 commit comments