2413cbcd80
the watcher can not normally get events of file changes on linux. it just can get the first two changes.
73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
//+build linux
|
|
|
|
package file
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
|
|
"github.com/fsnotify/fsnotify"
|
|
"github.com/micro/go-micro/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, errors.New("watcher stopped")
|
|
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, errors.New("watcher stopped")
|
|
}
|
|
}
|
|
|
|
func (w *watcher) Stop() error {
|
|
return w.fw.Close()
|
|
}
|