Auto merge of #31468 - pitdicker:fs_tests_cleanup, r=alexcrichton
See #29412
This commit is contained in:
commit
e06f6928cb
@ -1940,12 +1940,46 @@ mod tests {
|
||||
check!(fs::create_dir_all(&d2));
|
||||
check!(check!(File::create(&canary)).write(b"foo"));
|
||||
check!(symlink_junction(&d2, &dt.join("d2")));
|
||||
let _ = symlink_file(&canary, &d1.join("canary"));
|
||||
check!(fs::remove_dir_all(&d1));
|
||||
|
||||
assert!(!d1.is_dir());
|
||||
assert!(canary.exists());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn recursive_rmdir_of_symlink() {
|
||||
// test we do not recursively delete a symlink but only dirs.
|
||||
let tmpdir = tmpdir();
|
||||
let link = tmpdir.join("d1");
|
||||
let dir = tmpdir.join("d2");
|
||||
let canary = dir.join("do_not_delete");
|
||||
check!(fs::create_dir_all(&dir));
|
||||
check!(check!(File::create(&canary)).write(b"foo"));
|
||||
check!(symlink_junction(&dir, &link));
|
||||
check!(fs::remove_dir_all(&link));
|
||||
|
||||
assert!(!link.is_dir());
|
||||
assert!(canary.exists());
|
||||
}
|
||||
|
||||
#[test]
|
||||
// only Windows makes a distinction between file and directory symlinks.
|
||||
#[cfg(windows)]
|
||||
fn recursive_rmdir_of_file_symlink() {
|
||||
let tmpdir = tmpdir();
|
||||
if !got_symlink_permission(&tmpdir) { return };
|
||||
|
||||
let f1 = tmpdir.join("f1");
|
||||
let f2 = tmpdir.join("f2");
|
||||
check!(check!(File::create(&f1)).write(b"foo"));
|
||||
check!(symlink_file(&f1, &f2));
|
||||
match fs::remove_dir_all(&f2) {
|
||||
Ok(..) => panic!("wanted a failure"),
|
||||
Err(..) => {}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unicode_path_is_dir() {
|
||||
assert!(Path::new(".").is_dir());
|
||||
|
@ -627,10 +627,19 @@ pub fn rmdir(p: &Path) -> io::Result<()> {
|
||||
}
|
||||
|
||||
pub fn remove_dir_all(path: &Path) -> io::Result<()> {
|
||||
let filetype = try!(lstat(path)).file_type();
|
||||
if filetype.is_symlink() {
|
||||
unlink(path)
|
||||
} else {
|
||||
remove_dir_all_recursive(path)
|
||||
}
|
||||
}
|
||||
|
||||
fn remove_dir_all_recursive(path: &Path) -> io::Result<()> {
|
||||
for child in try!(readdir(path)) {
|
||||
let child = try!(child);
|
||||
if try!(child.file_type()).is_dir() {
|
||||
try!(remove_dir_all(&child.path()));
|
||||
try!(remove_dir_all_recursive(&child.path()));
|
||||
} else {
|
||||
try!(unlink(&child.path()));
|
||||
}
|
||||
|
@ -552,11 +552,22 @@ pub fn rmdir(p: &Path) -> io::Result<()> {
|
||||
}
|
||||
|
||||
pub fn remove_dir_all(path: &Path) -> io::Result<()> {
|
||||
let filetype = try!(lstat(path)).file_type();
|
||||
if filetype.is_symlink() {
|
||||
// On Windows symlinks to files and directories are removed differently.
|
||||
// rmdir only deletes dir symlinks and junctions, not file symlinks.
|
||||
rmdir(path)
|
||||
} else {
|
||||
remove_dir_all_recursive(path)
|
||||
}
|
||||
}
|
||||
|
||||
fn remove_dir_all_recursive(path: &Path) -> io::Result<()> {
|
||||
for child in try!(readdir(path)) {
|
||||
let child = try!(child);
|
||||
let child_type = try!(child.file_type());
|
||||
if child_type.is_dir() {
|
||||
try!(remove_dir_all(&child.path()));
|
||||
try!(remove_dir_all_recursive(&child.path()));
|
||||
} else if child_type.is_symlink_dir() {
|
||||
try!(rmdir(&child.path()));
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user