summaryrefslogtreecommitdiff
path: root/src/fswalk.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/fswalk.rs')
-rw-r--r--src/fswalk.rs18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/fswalk.rs b/src/fswalk.rs
index ac95540..d9ecb87 100644
--- a/src/fswalk.rs
+++ b/src/fswalk.rs
@@ -1,3 +1,4 @@
+use std::fs;
use std::io;
use std::path::PathBuf;
use std::cmp::Ordering;
@@ -6,18 +7,24 @@ use std::cmp::Ordering;
#[derive(Debug)]
pub struct Entry {
path: PathBuf,
+ meta: fs::Metadata,
}
impl Entry {
- fn new(path: &PathBuf) -> Entry {
+ fn new(path: &PathBuf, meta: &fs::Metadata) -> Entry {
Entry {
path: path.clone(),
+ meta: meta.clone(),
}
}
pub fn path(&self) -> String {
self.path.to_string_lossy().to_string()
}
+
+ pub fn metadata(&self) -> fs::Metadata {
+ self.meta.clone()
+ }
}
impl Eq for Entry {}
@@ -52,7 +59,8 @@ pub struct DirTree {
impl DirTree {
pub fn new(path: &str) -> DirTree {
let mut dt = DirTree::empty();
- dt.add_dir(&PathBuf::from(path));
+ let meta = fs::symlink_metadata(path).expect("can't stat dir");
+ dt.add_dir(&PathBuf::from(path), &meta);
dt
}
@@ -63,8 +71,8 @@ impl DirTree {
}
}
- fn add_dir(&mut self, path: &PathBuf) {
- let entry = Entry::new(path);
+ fn add_dir(&mut self, path: &PathBuf, meta: &fs::Metadata) {
+ let entry = Entry::new(path, meta);
self.dirs.push(entry);
}
@@ -74,7 +82,7 @@ impl DirTree {
for dir_entry in path.read_dir()? {
let dir_entry = dir_entry?;
let metadata = dir_entry.metadata()?;
- let entry = Entry::new(&dir_entry.path());
+ let entry = Entry::new(&dir_entry.path(), &metadata);
if metadata.is_dir() {
dirs.push(entry);
} else {