@@ -3265,7 +3265,7 @@ impl<'test> TestCx<'test> {
3265
3265
3266
3266
let tmpdir = cwd. join ( self . output_base_name ( ) ) ;
3267
3267
if tmpdir. exists ( ) {
3268
- fs :: remove_dir_all ( & tmpdir) . unwrap ( ) ;
3268
+ self . aggressive_rm_rf ( & tmpdir) . unwrap ( ) ;
3269
3269
}
3270
3270
create_dir_all ( & tmpdir) . unwrap ( ) ;
3271
3271
@@ -3404,6 +3404,29 @@ impl<'test> TestCx<'test> {
3404
3404
}
3405
3405
}
3406
3406
3407
+ fn aggressive_rm_rf ( & self , path : & Path ) -> io:: Result < ( ) > {
3408
+ for e in path. read_dir ( ) ? {
3409
+ let entry = e?;
3410
+ let path = entry. path ( ) ;
3411
+ if entry. file_type ( ) ?. is_dir ( ) {
3412
+ self . aggressive_rm_rf ( & path) ?;
3413
+ } else {
3414
+ // Remove readonly files as well on windows (by default we can't)
3415
+ fs:: remove_file ( & path) . or_else ( |e| {
3416
+ if cfg ! ( windows) && e. kind ( ) == io:: ErrorKind :: PermissionDenied {
3417
+ let mut meta = entry. metadata ( ) ?. permissions ( ) ;
3418
+ meta. set_readonly ( false ) ;
3419
+ fs:: set_permissions ( & path, meta) ?;
3420
+ fs:: remove_file ( & path)
3421
+ } else {
3422
+ Err ( e)
3423
+ }
3424
+ } ) ?;
3425
+ }
3426
+ }
3427
+ fs:: remove_dir ( path)
3428
+ }
3429
+
3407
3430
fn run_rmake_v2_test ( & self ) {
3408
3431
// For `run-make` V2, we need to perform 2 steps to build and run a `run-make` V2 recipe
3409
3432
// (`rmake.rs`) to run the actual tests. The support library is already built as a tool rust
@@ -3452,7 +3475,7 @@ impl<'test> TestCx<'test> {
3452
3475
// This setup intentionally diverges from legacy Makefile run-make tests.
3453
3476
let base_dir = self . output_base_name ( ) ;
3454
3477
if base_dir. exists ( ) {
3455
- fs :: remove_dir_all ( & base_dir) . unwrap ( ) ;
3478
+ self . aggressive_rm_rf ( & base_dir) . unwrap ( ) ;
3456
3479
}
3457
3480
let rmake_out_dir = base_dir. join ( "rmake_out" ) ;
3458
3481
create_dir_all ( & rmake_out_dir) . unwrap ( ) ;
0 commit comments