@@ -339,15 +339,18 @@ fn is_dir_empty(path: &Path) -> bool {
339
339
}
340
340
}
341
341
342
+ #[ cfg( unix) ]
343
+ fn is_readable_metadata ( metadata : & Metadata ) -> bool {
344
+ let mode = metadata. permissions ( ) . mode ( ) ;
345
+ ( mode & 0o400 ) > 0
346
+ }
347
+
342
348
/// Whether the given file or directory is readable.
343
349
#[ cfg( unix) ]
344
350
fn is_readable ( path : & Path ) -> bool {
345
351
match std:: fs:: metadata ( path) {
346
352
Err ( _) => false ,
347
- Ok ( metadata) => {
348
- let mode = metadata. permissions ( ) . mode ( ) ;
349
- ( mode & 0o400 ) > 0
350
- }
353
+ Ok ( metadata) => is_readable_metadata ( & metadata) ,
351
354
}
352
355
}
353
356
@@ -357,15 +360,18 @@ fn is_readable(_path: &Path) -> bool {
357
360
true
358
361
}
359
362
363
+ #[ cfg( unix) ]
364
+ fn is_writable_metadata ( metadata : & Metadata ) -> bool {
365
+ let mode = metadata. permissions ( ) . mode ( ) ;
366
+ ( mode & 0o200 ) > 0
367
+ }
368
+
360
369
/// Whether the given file or directory is writable.
361
370
#[ cfg( unix) ]
362
371
fn is_writable ( path : & Path ) -> bool {
363
372
match std:: fs:: metadata ( path) {
364
373
Err ( _) => false ,
365
- Ok ( metadata) => {
366
- let mode = metadata. permissions ( ) . mode ( ) ;
367
- ( mode & 0o200 ) > 0
368
- }
374
+ Ok ( metadata) => is_writable_metadata ( & metadata) ,
369
375
}
370
376
}
371
377
@@ -623,20 +629,25 @@ fn prompt_file_permission_readonly(path: &Path) -> bool {
623
629
// Most cases are covered by keep eye out for edge cases
624
630
#[ cfg( unix) ]
625
631
fn handle_writable_directory ( path : & Path , options : & Options , metadata : & Metadata ) -> bool {
626
- use std:: os:: unix:: fs:: PermissionsExt ;
627
- let mode = metadata. permissions ( ) . mode ( ) ;
628
- // Check if directory has user write permissions
629
- // Why is S_IWUSR showing up as a u16 on macos?
630
- #[ allow( clippy:: unnecessary_cast) ]
631
- let user_writable = ( mode & ( libc:: S_IWUSR as u32 ) ) != 0 ;
632
- if !user_writable {
633
- prompt_yes ! ( "remove write-protected directory {}?" , path. quote( ) )
634
- } else if options. interactive == InteractiveMode :: Always {
635
- prompt_yes ! ( "remove directory {}?" , path. quote( ) )
636
- } else {
637
- true
632
+ match (
633
+ is_readable_metadata ( metadata) ,
634
+ is_writable_metadata ( metadata) ,
635
+ options. interactive ,
636
+ ) {
637
+ ( false , false , _) => prompt_yes ! (
638
+ "attempt removal of inaccessible directory {}?" ,
639
+ path. quote( )
640
+ ) ,
641
+ ( false , true , InteractiveMode :: Always ) => prompt_yes ! (
642
+ "attempt removal of inaccessible directory {}?" ,
643
+ path. quote( )
644
+ ) ,
645
+ ( true , false , _) => prompt_yes ! ( "remove write-protected directory {}?" , path. quote( ) ) ,
646
+ ( _, _, InteractiveMode :: Always ) => prompt_yes ! ( "remove directory {}?" , path. quote( ) ) ,
647
+ ( _, _, _) => true ,
638
648
}
639
649
}
650
+
640
651
/// Checks if the path is referring to current or parent directory , if it is referring to current or any parent directory in the file tree e.g '/../..' , '../..'
641
652
fn path_is_current_or_parent_directory ( path : & Path ) -> bool {
642
653
let path_str = os_str_as_bytes ( path. as_os_str ( ) ) ;
0 commit comments