//go:build linux // +build linux package file import ( "os" "github.com/fsnotify/fsnotify" "go-micro.dev/v4/config/source" ) type watcher struct { f *file fw *fsnotify.Watcher exit chan bool } func newWatcher(f *file) (source.Watcher, error) { fw, err := fsnotify.NewWatcher() if err != nil { return nil, err } fw.Add(f.path) return &watcher{ f: f, fw: fw, exit: make(chan bool), }, nil } func (w *watcher) Next() (*source.ChangeSet, error) { // is it closed? select { case <-w.exit: return nil, source.ErrWatcherStopped default: } // try get the event select { case event := <-w.fw.Events: if event.Op == fsnotify.Rename { // check existence of file, and add watch again _, err := os.Stat(event.Name) if err == nil || os.IsExist(err) { w.fw.Add(event.Name) } } c, err := w.f.Read() if err != nil { return nil, err } // add path again for the event bug of fsnotify w.fw.Add(w.f.path) return c, nil case err := <-w.fw.Errors: return nil, err case <-w.exit: return nil, source.ErrWatcherStopped } } func (w *watcher) Stop() error { return w.fw.Close() }