@@ -3265,7 +3265,7 @@ impl<'test> TestCx<'test> {
32653265
32663266 let tmpdir = cwd. join ( self . output_base_name ( ) ) ;
32673267 if tmpdir. exists ( ) {
3268- fs :: remove_dir_all ( & tmpdir) . unwrap ( ) ;
3268+ self . aggressive_rm_rf ( & tmpdir) . unwrap ( ) ;
32693269 }
32703270 create_dir_all ( & tmpdir) . unwrap ( ) ;
32713271
@@ -3404,6 +3404,29 @@ impl<'test> TestCx<'test> {
34043404 }
34053405 }
34063406
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+
34073430 fn run_rmake_v2_test ( & self ) {
34083431 // For `run-make` V2, we need to perform 2 steps to build and run a `run-make` V2 recipe
34093432 // (`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> {
34523475 // This setup intentionally diverges from legacy Makefile run-make tests.
34533476 let base_dir = self . output_base_name ( ) ;
34543477 if base_dir. exists ( ) {
3455- fs :: remove_dir_all ( & base_dir) . unwrap ( ) ;
3478+ self . aggressive_rm_rf ( & base_dir) . unwrap ( ) ;
34563479 }
34573480 let rmake_out_dir = base_dir. join ( "rmake_out" ) ;
34583481 create_dir_all ( & rmake_out_dir) . unwrap ( ) ;
0 commit comments