github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/pkg/filenotify/filenotify.go (about)

     1  // Package filenotify provides a mechanism for watching file(s) for changes.
     2  // Generally leans on fsnotify, but provides a poll-based notifier which fsnotify does not support.
     3  // These are wrapped up in a common interface so that either can be used interchangeably in your code.
     4  package filenotify // import "github.com/demonoid81/moby/pkg/filenotify"
     5  
     6  import "github.com/fsnotify/fsnotify"
     7  
     8  // FileWatcher is an interface for implementing file notification watchers
     9  type FileWatcher interface {
    10  	Events() <-chan fsnotify.Event
    11  	Errors() <-chan error
    12  	Add(name string) error
    13  	Remove(name string) error
    14  	Close() error
    15  }
    16  
    17  // New tries to use an fs-event watcher, and falls back to the poller if there is an error
    18  func New() (FileWatcher, error) {
    19  	if watcher, err := NewEventWatcher(); err == nil {
    20  		return watcher, nil
    21  	}
    22  	return NewPollingWatcher(), nil
    23  }
    24  
    25  // NewPollingWatcher returns a poll-based file watcher
    26  func NewPollingWatcher() FileWatcher {
    27  	return &filePoller{
    28  		events: make(chan fsnotify.Event),
    29  		errors: make(chan error),
    30  	}
    31  }
    32  
    33  // NewEventWatcher returns an fs-event based file watcher
    34  func NewEventWatcher() (FileWatcher, error) {
    35  	watcher, err := fsnotify.NewWatcher()
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	return &fsNotifyWatcher{watcher}, nil
    40  }