Skip to content

Commit fbc60e6

Browse files
committed
run-make-support: re-export recursive_remove
This facade is like other `run_make_support::fs` APIs that panic-on-failure but includes the path that the operation was called on in the panic message.
1 parent bb7ef3d commit fbc60e6

File tree

1 file changed

+20
-3
lines changed
  • src/tools/run-make-support/src

1 file changed

+20
-3
lines changed

src/tools/run-make-support/src/fs.rs

+20-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::fs::FileType;
12
use std::io;
23
use std::path::{Path, PathBuf};
34

@@ -6,12 +7,13 @@ use std::path::{Path, PathBuf};
67
pub fn copy_symlink(src: impl AsRef<Path>, dst: impl AsRef<Path>) {
78
let src = src.as_ref();
89
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) {
1012
panic!("failed to copy symlink from `{}` to `{}`: {e}", src.display(), dst.display(),);
1113
}
1214
}
1315

14-
fn copy_symlink_raw(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()> {
16+
fn copy_symlink_raw(ty: FileType, src: impl AsRef<Path>, dst: impl AsRef<Path>) -> io::Result<()> {
1517
// Traverse symlink once to find path of target entity.
1618
let target_path = std::fs::read_link(src)?;
1719

@@ -55,7 +57,7 @@ pub fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) {
5557
if ty.is_dir() {
5658
copy_dir_all_inner(entry.path(), dst.join(entry.file_name()))?;
5759
} else if ty.is_symlink() {
58-
copy_symlink_raw(entry.path(), dst.join(entry.file_name()))?;
60+
copy_symlink_raw(ty, entry.path(), dst.join(entry.file_name()))?;
5961
} else {
6062
std::fs::copy(entry.path(), dst.join(entry.file_name()))?;
6163
}
@@ -81,6 +83,21 @@ pub fn read_dir_entries<P: AsRef<Path>, F: FnMut(&Path)>(dir: P, mut callback: F
8183
}
8284
}
8385

86+
/// A wrapper around [`build_helper::fs::recursive_remove`] which includes the file path in the
87+
/// panic message.
88+
///
89+
/// This handles removing symlinks on Windows (e.g. symlink-to-file will be removed via
90+
/// [`std::fs::remove_file`] while symlink-to-dir will be removed via [`std::fs::remove_dir`]).
91+
#[track_caller]
92+
pub fn recursive_remove<P: AsRef<Path>>(path: P) {
93+
if let Err(e) = build_helper::fs::recursive_remove(path.as_ref()) {
94+
panic!(
95+
"failed to recursive remove filesystem entities at `{}`: {e}",
96+
path.as_ref().display()
97+
);
98+
}
99+
}
100+
84101
/// A wrapper around [`std::fs::remove_file`] which includes the file path in the panic message.
85102
#[track_caller]
86103
pub fn remove_file<P: AsRef<Path>>(path: P) {

0 commit comments

Comments
 (0)