Skip to content

Commit

Permalink
Replace Walker by WalkDir
Browse files Browse the repository at this point in the history
Fixes #31
Might help with #17 and #21
  • Loading branch information
passcod committed Dec 6, 2015
1 parent d3af0af commit 6ab9eb2
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 70 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ libc = "*"
log = "*"
time = "*"
filetime = "*"
walker = "^1.0.0"
walkdir = "^0.1"

[target.x86_64-unknown-linux-gnu.dependencies]
inotify = "^0.1"
Expand Down
30 changes: 10 additions & 20 deletions src/inotify/mod.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
extern crate inotify as inotify_sys;
extern crate libc;
extern crate walker;
extern crate walkdir;

use self::inotify_sys::wrapper::{self, INotify, Watch};
use self::walker::Walker;
use self::walkdir::WalkDir;
use std::collections::HashMap;
use std::fs::metadata;
use std::path::{Path, PathBuf};
Expand Down Expand Up @@ -135,25 +135,15 @@ impl Watcher for INotifyWatcher {
Ok(m) => m.is_dir(),
Err(e) => return Err(Error::Io(e)),
};
if is_dir {
match Walker::new(path.as_ref()) {
Ok(dir) => {
for entry in dir {
match entry {
Ok(entry) => {
let path = entry.path();
try!(self.add_watch(&path));
},
Err(e) => return Err(Error::Io(e)),
}
}
self.add_watch(path.as_ref())
},
Err(e) => Err(Error::Io(e))
}
} else {
self.add_watch(&path.as_ref())

try!(self.add_watch(&path));
if !is_dir { return Ok(()); }

for entry in WalkDir::new(path).follow_links(true).into_iter().filter_map(|e| e.ok()) {
try!(self.add_watch(&entry.path()));
}

Ok(())
}

fn unwatch<P: AsRef<Path>>(&mut self, path: P) -> Result<(), Error> {
Expand Down
74 changes: 25 additions & 49 deletions src/poll.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ use std::fs;
use std::thread;
use super::{Error, Event, op, Watcher};
use std::path::{Path, PathBuf};
use self::walker::Walker;
use self::walkdir::WalkDir;

use filetime::FileTime;

extern crate walker;
extern crate walkdir;

pub struct PollWatcher {
tx: Sender<Event>,
Expand Down Expand Up @@ -90,54 +90,30 @@ impl PollWatcher {
}

// TODO: more efficient implementation where the dir tree is cached?
match Walker::new(watch) {
Err(e) => {
let _ = tx.send(Event {
path: Some(watch.clone()),
op: Err(Error::Io(e))
});
continue
},
Ok(iter) => {
for entry in iter {
match entry {
Ok(entry) => {
let path = entry.path();

match fs::metadata(&path) {
Err(e) => {
let _ = tx.send(Event {
path: Some(path.clone()),
op: Err(Error::Io(e))
});
continue
},
Ok(stat) => {
let modified =
FileTime::from_last_modification_time(&stat)
.seconds();

match mtimes.insert(path.clone(), modified) {
None => continue, // First run
Some(old) => {
if modified > old {
let _ = tx.send(Event {
path: Some(path.clone()),
op: Ok(op::WRITE)
});
continue
}
}
}
}
for entry in WalkDir::new(watch).follow_links(true).into_iter().filter_map(|e| e.ok()) {
let path = entry.path();

match fs::metadata(&path) {
Err(e) => {
let _ = tx.send(Event {
path: Some(path.to_path_buf()),
op: Err(Error::Io(e))
});
continue
},
Ok(stat) => {
let modified = FileTime::from_last_modification_time(&stat).seconds();
match mtimes.insert(path.clone().to_path_buf(), modified) {
None => continue, // First run
Some(old) => {
if modified > old {
let _ = tx.send(Event {
path: Some(path.to_path_buf()),
op: Ok(op::WRITE)
});
continue
}
},
Err(e) => {
let _ = tx.send(Event {
path: Some(watch.clone()),
op: Err(Error::Io(e))
});
},
}
}
}
}
Expand Down

0 comments on commit 6ab9eb2

Please sign in to comment.