diff options
Diffstat (limited to 'ignore/src/dir.rs')
-rw-r--r-- | ignore/src/dir.rs | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/ignore/src/dir.rs b/ignore/src/dir.rs index 95c71848..544440d0 100644 --- a/ignore/src/dir.rs +++ b/ignore/src/dir.rs @@ -21,6 +21,7 @@ use std::sync::{Arc, RwLock}; use gitignore::{self, Gitignore, GitignoreBuilder}; use pathutil::{is_hidden, strip_prefix}; use overrides::{self, Override}; +use same_file::Handle; use types::{self, Types}; use {Error, Match, PartialErrorBuilder}; @@ -95,6 +96,9 @@ struct IgnoreInner { compiled: Arc<RwLock<HashMap<OsString, Ignore>>>, /// The path to the directory that this matcher was built from. dir: PathBuf, + /// An open handle to the directory, for checking symlink loops in the + /// parallel iterator. + handle: Arc<Option<Handle>>, /// An override matcher (default is empty). overrides: Arc<Override>, /// A file type matcher. @@ -127,11 +131,15 @@ struct IgnoreInner { impl Ignore { /// Return the directory path of this matcher. - #[allow(dead_code)] pub fn path(&self) -> &Path { &self.0.dir } + /// Return a handle to the directory of this matcher. + pub fn handle(&self) -> Option<&Handle> { + (*self.0.handle).as_ref() + } + /// Return true if this matcher has no parent. pub fn is_root(&self) -> bool { self.0.parent.is_none() @@ -238,9 +246,17 @@ impl Ignore { errs.maybe_push(err); m }; + let handle = match Handle::from_path(dir) { + Ok(handle) => Some(handle), + Err(err) => { + errs.push(Error::from(err).with_path(dir)); + None + } + }; let ig = IgnoreInner { compiled: self.0.compiled.clone(), dir: dir.to_path_buf(), + handle: Arc::new(handle), overrides: self.0.overrides.clone(), types: self.0.types.clone(), parent: Some(self.clone()), @@ -451,9 +467,14 @@ impl IgnoreBuilder { } gi }; + let handle = match Handle::from_path(&self.dir) { + Ok(handle) => Some(handle), + Err(_) => None, + }; Ignore(Arc::new(IgnoreInner { compiled: Arc::new(RwLock::new(HashMap::new())), dir: self.dir.clone(), + handle: Arc::new(handle), overrides: self.overrides.clone(), types: self.types.clone(), parent: None, |