@@ -33,7 +33,7 @@ struct EventLoop {
3333    event_loop_rx :  Receiver < EventLoopMsg > , 
3434    kqueue :  kqueue:: Watcher , 
3535    event_handler :  Box < dyn  EventHandler > , 
36-     watches :  HashMap < PathBuf ,  bool > , 
36+     watches :  HashMap < PathBuf ,  ( bool ,   WatchFilter ) > , 
3737    follow_symlinks :  bool , 
3838} 
3939
@@ -45,7 +45,7 @@ pub struct KqueueWatcher {
4545} 
4646
4747enum  EventLoopMsg  { 
48-     AddWatch ( PathBuf ,  RecursiveMode ,  Sender < Result < ( ) > > ) , 
48+     AddWatch ( PathBuf ,  RecursiveMode ,  WatchFilter ,   Sender < Result < ( ) > > ) , 
4949    RemoveWatch ( PathBuf ,  Sender < Result < ( ) > > ) , 
5050    Shutdown , 
5151} 
@@ -130,8 +130,9 @@ impl EventLoop {
130130    fn  handle_messages ( & mut  self )  { 
131131        while  let  Ok ( msg)  = self . event_loop_rx . try_recv ( )  { 
132132            match  msg { 
133-                 EventLoopMsg :: AddWatch ( path,  recursive_mode,  tx)  => { 
134-                     let  _ = tx. send ( self . add_watch ( path,  recursive_mode. is_recursive ( ) ) ) ; 
133+                 EventLoopMsg :: AddWatch ( path,  recursive_mode,  watch_filter,  tx)  => { 
134+                     let  _ =
135+                         tx. send ( self . add_watch ( path,  recursive_mode. is_recursive ( ) ,  watch_filter) ) ; 
135136                } 
136137                EventLoopMsg :: RemoveWatch ( path,  tx)  => { 
137138                    let  _ = tx. send ( self . remove_watch ( path,  false ) ) ; 
@@ -288,11 +289,20 @@ impl EventLoop {
288289        } 
289290
290291        for  path in  add_watches { 
291-             self . add_watch ( path,  true ) . ok ( ) ; 
292+             self . add_watch ( path,  true ,   WatchFilter :: accept_all ( ) ) . ok ( ) ; 
292293        } 
293294    } 
294295
295-     fn  add_watch ( & mut  self ,  path :  PathBuf ,  is_recursive :  bool )  -> Result < ( ) >  { 
296+     fn  add_watch ( 
297+         & mut  self , 
298+         path :  PathBuf , 
299+         is_recursive :  bool , 
300+         watch_filter :  WatchFilter , 
301+     )  -> Result < ( ) >  { 
302+         if  !watch_filter. should_watch ( & path)  { 
303+             return  Ok ( ( ) ) ; 
304+         } 
305+ 
296306        // If the watch is not recursive, or if we determine (by stat'ing the path to get its 
297307        // metadata) that the watched path is not a directory, add a single path watch. 
298308        if  !is_recursive || !metadata ( & path) . map_err ( Error :: io) ?. is_dir ( )  { 
@@ -387,15 +397,20 @@ impl KqueueWatcher {
387397        Ok ( KqueueWatcher  {  channel,  waker } ) 
388398    } 
389399
390-     fn  watch_inner ( & mut  self ,  path :  & Path ,  recursive_mode :  RecursiveMode )  -> Result < ( ) >  { 
400+     fn  watch_inner ( 
401+         & mut  self , 
402+         path :  & Path , 
403+         recursive_mode :  RecursiveMode , 
404+         watch_filter :  WatchFilter , 
405+     )  -> Result < ( ) >  { 
391406        let  pb = if  path. is_absolute ( )  { 
392407            path. to_owned ( ) 
393408        }  else  { 
394409            let  p = env:: current_dir ( ) . map_err ( Error :: io) ?; 
395410            p. join ( path) 
396411        } ; 
397412        let  ( tx,  rx)  = unbounded ( ) ; 
398-         let  msg = EventLoopMsg :: AddWatch ( pb,  recursive_mode,  tx) ; 
413+         let  msg = EventLoopMsg :: AddWatch ( pb,  recursive_mode,  watch_filter ,   tx) ; 
399414
400415        self . channel 
401416            . send ( msg) 
@@ -436,8 +451,17 @@ impl Watcher for KqueueWatcher {
436451        Self :: from_event_handler ( Box :: new ( event_handler) ,  config. follow_symlinks ( ) ) 
437452    } 
438453
454+     fn  watch_filtered ( 
455+         & mut  self , 
456+         path :  & Path , 
457+         recursive_mode :  RecursiveMode , 
458+         watch_filter :  WatchFilter , 
459+     )  -> Result < ( ) >  { 
460+         self . watch_inner ( path,  recursive_mode,  watch_filter) 
461+     } 
462+ 
439463    fn  watch ( & mut  self ,  path :  & Path ,  recursive_mode :  RecursiveMode )  -> Result < ( ) >  { 
440-         self . watch_inner ( path,  recursive_mode) 
464+         self . watch_inner ( path,  recursive_mode,   WatchFilter :: accept_all ( ) ) 
441465    } 
442466
443467    fn  unwatch ( & mut  self ,  path :  & Path )  -> Result < ( ) >  { 
0 commit comments