diff options
author | Alexander Batischev <eual.jp@gmail.com> | 2021-07-28 19:50:03 +0300 |
---|---|---|
committer | Alexander Batischev <eual.jp@gmail.com> | 2021-07-28 23:02:24 +0300 |
commit | 3a1e5f10dd8aef4bc02f76e735c4a3244147ffe8 (patch) | |
tree | a30cd5ca8b498b9c9cca8ce95c7a0833dce8abb2 /src/fsiter.rs | |
parent | 97938e694da84f20d39f6895c50cd29b89cc7dd5 (diff) | |
download | obnam2-3a1e5f10dd8aef4bc02f76e735c4a3244147ffe8.tar.gz |
FsIter: annotate entries belonging to CACHEDIR.TAGs
Diffstat (limited to 'src/fsiter.rs')
-rw-r--r-- | src/fsiter.rs | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/fsiter.rs b/src/fsiter.rs index aea9078..2325793 100644 --- a/src/fsiter.rs +++ b/src/fsiter.rs @@ -3,6 +3,13 @@ use log::{debug, warn}; use std::path::{Path, PathBuf}; use walkdir::{DirEntry, IntoIter, WalkDir}; +/// Filesystem entry along with additional info about it. +pub struct AnnotatedFsEntry { + pub inner: FilesystemEntry, + /// Is `entry` a valid CACHEDIR.TAG? + pub is_cachedir_tag: bool, +} + /// Iterator over file system entries in a directory tree. pub struct FsIterator { iter: SkipCachedirs, @@ -32,7 +39,7 @@ impl FsIterator { } impl Iterator for FsIterator { - type Item = Result<FilesystemEntry, FsIterError>; + type Item = Result<AnnotatedFsEntry, FsIterError>; fn next(&mut self) -> Option<Self::Item> { self.iter.next() } @@ -45,7 +52,7 @@ struct SkipCachedirs { exclude_cache_tag_directories: bool, // This is the last tag we've found. `next()` will yield it before asking `iter` for more // entries. - cachedir_tag: Option<Result<FilesystemEntry, FsIterError>>, + cachedir_tag: Option<Result<AnnotatedFsEntry, FsIterError>>, } impl SkipCachedirs { @@ -94,13 +101,13 @@ impl SkipCachedirs { if content == CACHEDIR_TAG { self.iter.skip_current_dir(); - self.cachedir_tag = Some(new_entry(&tag_path)); + self.cachedir_tag = Some(new_entry(&tag_path, true)); } } } impl Iterator for SkipCachedirs { - type Item = Result<FilesystemEntry, FsIterError>; + type Item = Result<AnnotatedFsEntry, FsIterError>; fn next(&mut self) -> Option<Self::Item> { self.cachedir_tag.take().or_else(|| { @@ -111,14 +118,14 @@ impl Iterator for SkipCachedirs { Some(Err(err)) => Some(Err(FsIterError::WalkDir(err))), Some(Ok(entry)) => { self.try_enqueue_cachedir_tag(&entry); - Some(new_entry(entry.path())) + Some(new_entry(entry.path(), false)) } } }) } } -fn new_entry(path: &Path) -> Result<FilesystemEntry, FsIterError> { +fn new_entry(path: &Path, is_cachedir_tag: bool) -> Result<AnnotatedFsEntry, FsIterError> { let meta = std::fs::symlink_metadata(path); debug!("metadata for {:?}: {:?}", path, meta); let meta = match meta { @@ -130,5 +137,9 @@ fn new_entry(path: &Path) -> Result<FilesystemEntry, FsIterError> { }; let entry = FilesystemEntry::from_metadata(path, &meta)?; debug!("FileSystemEntry for {:?}: {:?}", path, entry); - Ok(entry) + let annotated = AnnotatedFsEntry { + inner: entry, + is_cachedir_tag, + }; + Ok(annotated) } |