summaryrefslogtreecommitdiff
path: root/pkg/hooks/monitor.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/hooks/monitor.go')
-rw-r--r--pkg/hooks/monitor.go54
1 files changed, 42 insertions, 12 deletions
diff --git a/pkg/hooks/monitor.go b/pkg/hooks/monitor.go
index ba5e0f246..febe3483f 100644
--- a/pkg/hooks/monitor.go
+++ b/pkg/hooks/monitor.go
@@ -2,6 +2,7 @@ package hooks
import (
"context"
+ "os"
"path/filepath"
"github.com/fsnotify/fsnotify"
@@ -11,7 +12,7 @@ import (
// Monitor dynamically monitors hook directories for additions,
// updates, and removals.
//
-// This function write two empty structs to the sync channel: the
+// This function writes two empty structs to the sync channel: the
// first is written after the watchers are established and the second
// when this function exits. The expected usage is:
//
@@ -48,18 +49,47 @@ func (m *Manager) Monitor(ctx context.Context, sync chan<- error) {
for {
select {
case event := <-watcher.Events:
- if event.Op&fsnotify.Remove == fsnotify.Remove {
- ok := m.remove(filepath.Base(event.Name))
- if ok {
- logrus.Debugf("removed hook %s", event.Name)
+ filename := filepath.Base(event.Name)
+ if len(m.directories) <= 1 {
+ if event.Op&fsnotify.Remove == fsnotify.Remove {
+ ok := m.remove(filename)
+ if ok {
+ logrus.Debugf("removed hook %s", event.Name)
+ }
+ } else if event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Write == fsnotify.Write {
+ err = m.add(event.Name)
+ if err == nil {
+ logrus.Debugf("added hook %s", event.Name)
+ } else if err != ErrNoJSONSuffix {
+ logrus.Errorf("failed to add hook %s: %v", event.Name, err)
+ }
}
- }
- if event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Write == fsnotify.Write {
- err = m.add(event.Name)
- if err == nil {
- logrus.Debugf("added hook %s", event.Name)
- } else if err != ErrNoJSONSuffix {
- logrus.Errorf("failed to add hook %s: %v", event.Name, err)
+ } else if event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Remove == fsnotify.Remove {
+ err = nil
+ found := false
+ for i := len(m.directories) - 1; i >= 0; i-- {
+ path := filepath.Join(m.directories[i], filename)
+ err = m.add(path)
+ if err == nil {
+ found = true
+ logrus.Debugf("(re)added hook %s (triggered activity on %s)", path, event.Name)
+ break
+ } else if err == ErrNoJSONSuffix {
+ found = true
+ break // this is not going to change for fallback directories
+ } else if os.IsNotExist(err) {
+ continue // move on to the next fallback directory
+ } else {
+ found = true
+ logrus.Errorf("failed to (re)add hook %s (triggered by activity on %s): %v", path, event.Name, err)
+ break
+ }
+ }
+ if (found || event.Op&fsnotify.Remove == fsnotify.Remove) && err != nil {
+ ok := m.remove(filename)
+ if ok {
+ logrus.Debugf("removed hook %s (triggered by activity on %s)", filename, event.Name)
+ }
}
}
case <-ctx.Done():