1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- //go:build !linux
- // +build !linux
- package file
- import (
- "os"
- "github.com/fsnotify/fsnotify"
- "gogs.baozhida.cn/zoie/OAuth-core/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
- }
- err = fw.Add(f.path)
- if err != nil {
- return nil, err
- }
- 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) {
- err := w.fw.Add(event.Name)
- if err != nil {
- return nil, err
- }
- }
- }
- 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, source.ErrWatcherStopped
- }
- }
- func (w *watcher) Stop() error {
- return w.fw.Close()
- }
|