1
+ use std:: fs:: FileType ;
1
2
use std:: io;
2
3
use std:: path:: { Path , PathBuf } ;
3
4
@@ -6,7 +7,8 @@ use std::path::{Path, PathBuf};
6
7
pub fn copy_symlink ( src : impl AsRef < Path > , dst : impl AsRef < Path > ) {
7
8
let src = src. as_ref ( ) ;
8
9
let dst = dst. as_ref ( ) ;
9
- if let Err ( e) = copy_symlink_raw ( src, dst) {
10
+ let metadata = symlink_metadata ( src) ;
11
+ if let Err ( e) = copy_symlink_raw ( metadata. file_type ( ) , src, dst) {
10
12
panic ! ( "failed to copy symlink from `{}` to `{}`: {e}" , src. display( ) , dst. display( ) , ) ;
11
13
}
12
14
}
@@ -56,7 +58,7 @@ pub fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) {
56
58
if ty. is_dir ( ) {
57
59
copy_dir_all_inner ( entry. path ( ) , dst. join ( entry. file_name ( ) ) ) ?;
58
60
} else if ty. is_symlink ( ) {
59
- copy_symlink_raw ( entry. path ( ) , dst. join ( entry. file_name ( ) ) ) ?;
61
+ copy_symlink_raw ( ty , entry. path ( ) , dst. join ( entry. file_name ( ) ) ) ?;
60
62
} else {
61
63
std:: fs:: copy ( entry. path ( ) , dst. join ( entry. file_name ( ) ) ) ?;
62
64
}
@@ -82,6 +84,21 @@ pub fn read_dir_entries<P: AsRef<Path>, F: FnMut(&Path)>(dir: P, mut callback: F
82
84
}
83
85
}
84
86
87
+ /// A wrapper around [`build_helper::fs::recursive_remove`] which includes the file path in the
88
+ /// panic message.
89
+ ///
90
+ /// This handles removing symlinks on Windows (e.g. symlink-to-file will be removed via
91
+ /// [`std::fs::remove_file`] while symlink-to-dir will be removed via [`std::fs::remove_dir`]).
92
+ #[ track_caller]
93
+ pub fn recursive_remove < P : AsRef < Path > > ( path : P ) {
94
+ if let Err ( e) = build_helper:: fs:: recursive_remove ( path. as_ref ( ) ) {
95
+ panic ! (
96
+ "failed to recursive remove filesystem entities at `{}`: {e}" ,
97
+ path. as_ref( ) . display( )
98
+ ) ;
99
+ }
100
+ }
101
+
85
102
/// A wrapper around [`std::fs::remove_file`] which includes the file path in the panic message.
86
103
#[ track_caller]
87
104
pub fn remove_file < P : AsRef < Path > > ( path : P ) {
0 commit comments