2413cbcd80
the watcher can not normally get events of file changes on linux. it just can get the first two changes.
69 lines
1.1 KiB
Go
69 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
|
|
}
|
|
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()
|
|
}
|