75 lines
1.3 KiB
Go
75 lines
1.3 KiB
Go
//go:build !darwin
|
|
// +build !darwin
|
|
|
|
package watchers
|
|
|
|
import (
|
|
"git.sr.ht/~rjarry/aerc/lib/log"
|
|
"github.com/fsnotify/fsnotify"
|
|
)
|
|
|
|
func init() {
|
|
RegisterWatcherFactory(newInotifyWatcher)
|
|
}
|
|
|
|
type inotifyWatcher struct {
|
|
w *fsnotify.Watcher
|
|
ch chan *FSEvent
|
|
}
|
|
|
|
func newInotifyWatcher() (FSWatcher, error) {
|
|
watcher := &inotifyWatcher{
|
|
ch: make(chan *FSEvent),
|
|
}
|
|
w, err := fsnotify.NewWatcher()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
watcher.w = w
|
|
|
|
go watcher.watch()
|
|
return watcher, nil
|
|
}
|
|
|
|
func (w *inotifyWatcher) watch() {
|
|
defer log.PanicHandler()
|
|
for ev := range w.w.Events {
|
|
// we only care about files being created, removed or renamed
|
|
switch ev.Op {
|
|
case fsnotify.Create:
|
|
w.ch <- &FSEvent{
|
|
Operation: FSCreate,
|
|
Path: ev.Name,
|
|
}
|
|
case fsnotify.Remove:
|
|
w.ch <- &FSEvent{
|
|
Operation: FSRemove,
|
|
Path: ev.Name,
|
|
}
|
|
case fsnotify.Rename:
|
|
w.ch <- &FSEvent{
|
|
Operation: FSRename,
|
|
Path: ev.Name,
|
|
}
|
|
default:
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
func (w *inotifyWatcher) Configure(root string) error {
|
|
return w.w.Add(root)
|
|
}
|
|
|
|
func (w *inotifyWatcher) Events() chan *FSEvent {
|
|
return w.ch
|
|
}
|
|
|
|
func (w *inotifyWatcher) Add(p string) error {
|
|
return w.w.Add(p)
|
|
}
|
|
|
|
func (w *inotifyWatcher) Remove(p string) error {
|
|
return w.w.Remove(p)
|
|
}
|