@@ -5,11 +5,11 @@ use std::fs;
55use std:: thread;
66use super :: { Error , Event , op, Watcher } ;
77use std:: path:: { Path , PathBuf } ;
8- use self :: walker :: Walker ;
8+ use self :: walkdir :: WalkDir ;
99
1010use filetime:: FileTime ;
1111
12- extern crate walker ;
12+ extern crate walkdir ;
1313
1414pub struct PollWatcher {
1515 tx : Sender < Event > ,
@@ -90,54 +90,31 @@ impl PollWatcher {
9090 }
9191
9292 // TODO: more efficient implementation where the dir tree is cached?
93- match Walker :: new ( watch) {
94- Err ( e) => {
95- let _ = tx. send ( Event {
96- path : Some ( watch. clone ( ) ) ,
97- op : Err ( Error :: Io ( e) )
98- } ) ;
99- continue
100- } ,
101- Ok ( iter) => {
102- for entry in iter {
103- match entry {
104- Ok ( entry) => {
105- let path = entry. path ( ) ;
106-
107- match fs:: metadata ( & path) {
108- Err ( e) => {
109- let _ = tx. send ( Event {
110- path : Some ( path. clone ( ) ) ,
111- op : Err ( Error :: Io ( e) )
112- } ) ;
113- continue
114- } ,
115- Ok ( stat) => {
116- let modified =
117- FileTime :: from_last_modification_time ( & stat)
118- . seconds ( ) ;
119-
120- match mtimes. insert ( path. clone ( ) , modified) {
121- None => continue , // First run
122- Some ( old) => {
123- if modified > old {
124- let _ = tx. send ( Event {
125- path : Some ( path. clone ( ) ) ,
126- op : Ok ( op:: WRITE )
127- } ) ;
128- continue
129- }
130- }
131- }
132- }
93+ for entry in WalkDir :: new ( watch) . follow_links ( true )
94+ . into_iter ( ) . filter_map ( |e| e. ok ( ) ) {
95+ let path = entry. path ( ) ;
96+
97+ match fs:: metadata ( & path) {
98+ Err ( e) => {
99+ let _ = tx. send ( Event {
100+ path : Some ( path. to_path_buf ( ) ) ,
101+ op : Err ( Error :: Io ( e) )
102+ } ) ;
103+ continue
104+ } ,
105+ Ok ( stat) => {
106+ let modified = FileTime :: from_last_modification_time ( & stat) . seconds ( ) ;
107+ match mtimes. insert ( path. clone ( ) . to_path_buf ( ) , modified) {
108+ None => continue , // First run
109+ Some ( old) => {
110+ if modified > old {
111+ let _ = tx. send ( Event {
112+ path : Some ( path. to_path_buf ( ) ) ,
113+ op : Ok ( op:: WRITE )
114+ } ) ;
115+ continue
133116 }
134- } ,
135- Err ( e) => {
136- let _ = tx. send ( Event {
137- path : Some ( watch. clone ( ) ) ,
138- op : Err ( Error :: Io ( e) )
139- } ) ;
140- } ,
117+ }
141118 }
142119 }
143120 }
0 commit comments