| 147 | } |
| 148 | |
| 149 | func (w *Watcher) loop() { |
| 150 | // A disabled (no-op) watcher has no fsnotify handle — just block until close. |
| 151 | if w.fs == nil { |
| 152 | <-w.stopCh |
| 153 | return |
| 154 | } |
| 155 | for { |
| 156 | select { |
| 157 | case <-w.stopCh: |
| 158 | return |
| 159 | case err, ok := <-w.fs.Errors: |
| 160 | if !ok { |
| 161 | return |
| 162 | } |
| 163 | log.Printf("watcher error: %v", err) |
| 164 | case ev, ok := <-w.fs.Events: |
| 165 | if !ok { |
| 166 | return |
| 167 | } |
| 168 | w.handle(ev) |
| 169 | } |
| 170 | } |
| 171 | } |
| 172 | |
| 173 | func (w *Watcher) relativePath(absPath string) string { |
| 174 | rel, err := filepath.Rel(w.root, absPath) |