...
1 package watch
2
3 import (
4 "os"
5 "os/signal"
6 "path/filepath"
7
8 syscall "golang.org/x/sys/unix"
9
10 "github.com/fsnotify/fsnotify"
11 )
12
13 func CreateWatchers(filePath string) (chan os.Signal, *fsnotify.Watcher, error) {
14 osWatcher := newSignalWatcher(syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
15
16 filesystemWatcher, err := NewFilesystemWatcher(filePath)
17 if err != nil {
18 return nil, nil, err
19 }
20
21 return osWatcher, filesystemWatcher, nil
22 }
23
24 func NewFilesystemWatcher(filePath string) (*fsnotify.Watcher, error) {
25 watcher, err := fsnotify.NewWatcher()
26 if err != nil {
27 return nil, err
28 }
29
30 var files []string
31 err = filepath.Walk(filePath, func(path string, info os.FileInfo, err error) error {
32 if info.IsDir() {
33 files = append(files, path)
34 }
35 return err
36 })
37 if err != nil {
38 return nil, err
39 }
40
41 for _, file := range files {
42 err = watcher.Add(file)
43 if err != nil {
44 watcher.Close()
45 return nil, err
46 }
47 }
48
49 return watcher, nil
50 }
51
52 func newSignalWatcher(signals ...os.Signal) chan os.Signal {
53 signalChan := make(chan os.Signal, 1)
54 signal.Notify(signalChan, signals...)
55 return signalChan
56 }
57
58 func NewConfigWatcher(filePath string) (*fsnotify.Watcher, error) {
59 watcher, err := fsnotify.NewWatcher()
60 if err != nil {
61 return nil, err
62 }
63
64 err = watcher.Add(filePath)
65 if err != nil {
66 watcher.Close()
67 return nil, err
68 }
69 return watcher, nil
70 }
71
View as plain text