summaryrefslogtreecommitdiffstats
path: root/watcher/filenotify/filenotify.go
diff options
context:
space:
mode:
Diffstat (limited to 'watcher/filenotify/filenotify.go')
-rw-r--r--watcher/filenotify/filenotify.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/watcher/filenotify/filenotify.go b/watcher/filenotify/filenotify.go
new file mode 100644
index 000000000..b9d0d2e14
--- /dev/null
+++ b/watcher/filenotify/filenotify.go
@@ -0,0 +1,49 @@
+// Package filenotify provides a mechanism for watching file(s) for changes.
+// Generally leans on fsnotify, but provides a poll-based notifier which fsnotify does not support.
+// These are wrapped up in a common interface so that either can be used interchangeably in your code.
+//
+// This package is adapted from https://github.com/moby/moby/tree/master/pkg/filenotify, Apache-2.0 License.
+// Hopefully this can be replaced with an external package sometime in the future, see https://github.com/fsnotify/fsnotify/issues/9
+package filenotify
+
+import (
+ "time"
+
+ "github.com/fsnotify/fsnotify"
+)
+
+// FileWatcher is an interface for implementing file notification watchers
+type FileWatcher interface {
+ Events() <-chan fsnotify.Event
+ Errors() <-chan error
+ Add(name string) error
+ Remove(name string) error
+ Close() error
+}
+
+// New tries to use an fs-event watcher, and falls back to the poller if there is an error
+func New(interval time.Duration) (FileWatcher, error) {
+ if watcher, err := NewEventWatcher(); err == nil {
+ return watcher, nil
+ }
+ return NewPollingWatcher(interval), nil
+}
+
+// NewPollingWatcher returns a poll-based file watcher
+func NewPollingWatcher(interval time.Duration) FileWatcher {
+ return &filePoller{
+ interval: interval,
+ done: make(chan struct{}),
+ events: make(chan fsnotify.Event),
+ errors: make(chan error),
+ }
+}
+
+// NewEventWatcher returns an fs-event based file watcher
+func NewEventWatcher() (FileWatcher, error) {
+ watcher, err := fsnotify.NewWatcher()
+ if err != nil {
+ return nil, err
+ }
+ return &fsNotifyWatcher{watcher}, nil
+}