ignore: be fastidious with file handles

This commit fixes the symlink loop checker in the parallel directory
traverser to open fewer handles at the expense of keeping handles held
open longer.

This roughly matches the corresponding change in walkdir:
5bcc5b87ee

Fixes #633
This commit is contained in:
Andrew Gallant
2017-10-21 22:29:21 -04:00
parent 2a14bf2249
commit 1bf9d29259
2 changed files with 27 additions and 6 deletions

View File

@@ -11,7 +11,7 @@ use std::time::Duration;
use std::vec;
use crossbeam::sync::MsQueue;
use same_file::is_same_file;
use same_file::Handle;
use walkdir::{self, WalkDir};
use dir::{Ignore, IgnoreBuilder};
@@ -1308,11 +1308,11 @@ fn check_symlink_loop(
child_path: &Path,
child_depth: usize,
) -> Result<(), Error> {
let hchild = Handle::from_path(child_path).map_err(|err| {
Error::from(err).with_path(child_path).with_depth(child_depth)
})?;
for ig in ig_parent.parents().take_while(|ig| !ig.is_absolute_parent()) {
let same = try!(is_same_file(ig.path(), child_path).map_err(|err| {
Error::from(err).with_path(child_path).with_depth(child_depth)
}));
if same {
if ig.handle().map_or(true, |parent| parent == &hchild) {
return Err(Error::Loop {
ancestor: ig.path().to_path_buf(),
child: child_path.to_path_buf(),