parent
fb172b676e
commit
d47036cbd1
3 changed files with 56 additions and 2 deletions
|
@ -1881,12 +1881,46 @@ mod tests {
|
||||||
check!(fs::create_dir_all(&d2));
|
check!(fs::create_dir_all(&d2));
|
||||||
check!(check!(File::create(&canary)).write(b"foo"));
|
check!(check!(File::create(&canary)).write(b"foo"));
|
||||||
check!(symlink_junction(&d2, &dt.join("d2")));
|
check!(symlink_junction(&d2, &dt.join("d2")));
|
||||||
|
check!(symlink_file(&canary, &d1.join("canary")));
|
||||||
check!(fs::remove_dir_all(&d1));
|
check!(fs::remove_dir_all(&d1));
|
||||||
|
|
||||||
assert!(!d1.is_dir());
|
assert!(!d1.is_dir());
|
||||||
assert!(canary.exists());
|
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]
|
#[test]
|
||||||
fn unicode_path_is_dir() {
|
fn unicode_path_is_dir() {
|
||||||
assert!(Path::new(".").is_dir());
|
assert!(Path::new(".").is_dir());
|
||||||
|
|
|
@ -511,10 +511,19 @@ pub fn rmdir(p: &Path) -> io::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_dir_all(path: &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)) {
|
for child in try!(readdir(path)) {
|
||||||
let child = try!(child);
|
let child = try!(child);
|
||||||
if try!(child.file_type()).is_dir() {
|
if try!(child.file_type()).is_dir() {
|
||||||
try!(remove_dir_all(&child.path()));
|
try!(remove_dir_all_recursive(&child.path()));
|
||||||
} else {
|
} else {
|
||||||
try!(unlink(&child.path()));
|
try!(unlink(&child.path()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -525,11 +525,22 @@ pub fn rmdir(p: &Path) -> io::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_dir_all(path: &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)) {
|
for child in try!(readdir(path)) {
|
||||||
let child = try!(child);
|
let child = try!(child);
|
||||||
let child_type = try!(child.file_type());
|
let child_type = try!(child.file_type());
|
||||||
if child_type.is_dir() {
|
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() {
|
} else if child_type.is_symlink_dir() {
|
||||||
try!(rmdir(&child.path()));
|
try!(rmdir(&child.path()));
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue