123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- //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
- }
- 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()
- }
|