plugins/internal/plugin/deletion_watcher.go (51 lines of code) (raw):
//go:build windows
package plugin
import (
"github.com/fsnotify/fsnotify"
)
type DeletionWatcher struct {
watcher *fsnotify.Watcher
Deleted chan struct{}
Errors chan error
}
func WatchForDeletion(file string) (*DeletionWatcher, error) {
// Create a new filesystem watcher
fsWatcher, err := fsnotify.NewWatcher()
if err != nil {
return nil, err
}
// Add a watch for the specified file
err = fsWatcher.Add(file)
if err != nil {
return nil, err
}
// Wrap the filesystem watcher in a deletion watcher
deletionWatcher := &DeletionWatcher{
watcher: fsWatcher,
Deleted: make(chan struct{}, 1),
Errors: make(chan error, 1),
}
// Start the watcher goroutine
go deletionWatcher.watch()
return deletionWatcher, nil
}
// Cancels the watch
func (d *DeletionWatcher) Cancel() {
d.watcher.Close()
}
func (d *DeletionWatcher) watch() {
// Ensure the underlying filesystem watcher is closed when we are done
defer d.watcher.Close()
// Ensure the channels are closed when we are done
defer close(d.Deleted)
defer close(d.Errors)
// Process events and errors
for {
select {
case event, ok := <-d.watcher.Events:
if !ok {
return
}
// Check whether the event is a deletion event
if event.Op&fsnotify.Remove == fsnotify.Remove {
d.Deleted <- struct{}{}
return
}
case err, ok := <-d.watcher.Errors:
if !ok {
return
}
d.Errors <- err
}
}
}