Auto merge of - pitdicker:fs_tests_cleanup, r=alexcrichton

See 
This commit is contained in:
bors 2016-02-08 07:38:11 +00:00
commit e06f6928cb
3 changed files with 56 additions and 2 deletions
src/libstd
fs.rs
sys
unix
windows

@ -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 {