summaryrefslogtreecommitdiff
path: root/src/fsiter.rs
diff options
context:
space:
mode:
authorAlexander Batischev <eual.jp@gmail.com>2021-07-28 19:50:03 +0300
committerAlexander Batischev <eual.jp@gmail.com>2021-07-28 23:02:24 +0300
commit3a1e5f10dd8aef4bc02f76e735c4a3244147ffe8 (patch)
treea30cd5ca8b498b9c9cca8ce95c7a0833dce8abb2 /src/fsiter.rs
parent97938e694da84f20d39f6895c50cd29b89cc7dd5 (diff)
downloadobnam2-3a1e5f10dd8aef4bc02f76e735c4a3244147ffe8.tar.gz
FsIter: annotate entries belonging to CACHEDIR.TAGs
Diffstat (limited to 'src/fsiter.rs')
-rw-r--r--src/fsiter.rs25
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)
}