55 "context"
66 "fmt"
77 "io"
8- "io/fs"
98 "log"
109 "os"
1110 "os/signal"
@@ -21,6 +20,8 @@ import (
2120 "github.com/fsnotify/fsnotify"
2221 "github.com/spf13/pflag"
2322 "golang.org/x/xerrors"
23+
24+ "github.com/makiuchi-d/arelo/fspoll"
2425)
2526
2627const (
@@ -44,6 +45,7 @@ Options:
4445 help = pflag .BoolP ("help" , "h" , false , "display this message" )
4546 showver = pflag .BoolP ("version" , "V" , false , "display version" )
4647 filters = pflag .StringArrayP ("filter" , "f" , nil , "filter file system `event` (CREATE|WRITE|REMOVE|RENAME|CHMOD)" )
48+ polling = pflag .Duration ("polling" , 0 , "poll files at given `interval` instead of using fsnotify" )
4749)
4850
4951func main () {
@@ -89,7 +91,7 @@ func main() {
8991 os .Exit (1 )
9092 }
9193
92- modC , errC , err := watcher (* targets , * patterns , * ignores , filtOp )
94+ modC , errC , err := watcher (* targets , * patterns , * ignores , filtOp , * polling )
9395 if err != nil {
9496 log .Fatalf ("[ARELO] wacher error: %v" , err )
9597 }
@@ -166,12 +168,18 @@ func parseFilters(filters []string) (fsnotify.Op, error) {
166168 return op , nil
167169}
168170
169- func watcher (targets , patterns , ignores []string , filtOp fsnotify.Op ) (<- chan string , <- chan error , error ) {
170- w , err := fsnotify .NewWatcher ()
171+ func newWatcher (interval time.Duration ) (fspoll.Watcher , error ) {
172+ if interval == 0 {
173+ return fspoll .Wrap (fsnotify .NewWatcher ())
174+ }
175+ return fspoll .New (interval ), nil
176+ }
177+
178+ func watcher (targets , patterns , ignores []string , filtOp fsnotify.Op , interval time.Duration ) (<- chan string , <- chan error , error ) {
179+ w , err := newWatcher (interval )
171180 if err != nil {
172181 return nil , nil , err
173182 }
174-
175183 if err := addTargets (w , targets , patterns , ignores ); err != nil {
176184 return nil , nil , err
177185 }
@@ -184,7 +192,7 @@ func watcher(targets, patterns, ignores []string, filtOp fsnotify.Op) (<-chan st
184192 defer close (modC )
185193 for {
186194 select {
187- case event , ok := <- w .Events :
195+ case event , ok := <- w .Events () :
188196 if ! ok {
189197 errC <- xerrors .Errorf ("watcher.Events closed" )
190198 return
@@ -216,15 +224,15 @@ func watcher(targets, patterns, ignores []string, filtOp fsnotify.Op) (<-chan st
216224 // ignore stat errors (notfound, permission, etc.)
217225 log .Printf ("[ARELO] watcher: %v" , err )
218226 } else if fi .IsDir () {
219- err := addDirRecursive (w , fi , name , patterns , ignores , modC )
227+ err := addDirRecursive (w , name , patterns , ignores , modC )
220228 if err != nil {
221229 errC <- err
222230 return
223231 }
224232 }
225233 }
226234
227- case err , ok := <- w .Errors :
235+ case err , ok := <- w .Errors () :
228236 errC <- xerrors .Errorf ("watcher.Errors (%v): %w" , ok , err )
229237 return
230238 }
@@ -256,15 +264,15 @@ func matchPatterns(t string, pats []string) (bool, error) {
256264 return false , nil
257265}
258266
259- func addTargets (w * fsnotify .Watcher , targets , patterns , ignores []string ) error {
267+ func addTargets (w fspoll .Watcher , targets , patterns , ignores []string ) error {
260268 for _ , t := range targets {
261269 t = path .Clean (t )
262270 fi , err := os .Stat (t )
263271 if err != nil {
264272 return xerrors .Errorf ("stat: %w" , err )
265273 }
266274 if fi .IsDir () {
267- if err := addDirRecursive (w , fi , t , patterns , ignores , nil ); err != nil {
275+ if err := addDirRecursive (w , t , patterns , ignores , nil ); err != nil {
268276 return err
269277 }
270278 }
@@ -276,7 +284,7 @@ func addTargets(w *fsnotify.Watcher, targets, patterns, ignores []string) error
276284 return nil
277285}
278286
279- func addDirRecursive (w * fsnotify .Watcher , fi fs. FileInfo , t string , patterns , ignores []string , ch chan <- string ) error {
287+ func addDirRecursive (w fspoll .Watcher , t string , patterns , ignores []string , ch chan <- string ) error {
280288 logVerbose ("watching target: %q" , t )
281289 err := w .Add (t )
282290 if err != nil {
@@ -301,11 +309,7 @@ func addDirRecursive(w *fsnotify.Watcher, fi fs.FileInfo, t string, patterns, ig
301309 }
302310 }
303311 if de .IsDir () {
304- fi , err := de .Info ()
305- if err != nil {
306- return err
307- }
308- err = addDirRecursive (w , fi , name , patterns , ignores , ch )
312+ err = addDirRecursive (w , name , patterns , ignores , ch )
309313 if err != nil {
310314 return err
311315 }
0 commit comments