| 155 | } |
| 156 | |
| 157 | func (fw *fsWatcher) addRecursive(dir string) []FSEvent { |
| 158 | var events []FSEvent |
| 159 | if walkErr := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { |
| 160 | if err != nil { |
| 161 | return nil //nolint:nilerr // best-effort |
| 162 | } |
| 163 | base := filepath.Base(path) |
| 164 | if _, skip := skipDirs[base]; skip && info.IsDir() { |
| 165 | return filepath.SkipDir |
| 166 | } |
| 167 | if info.IsDir() { |
| 168 | if addErr := fw.w.Add(path); addErr != nil { |
| 169 | fw.logger.Debug(context.Background(), "failed to add watch", |
| 170 | slog.F("path", path), slog.Error(addErr)) |
| 171 | } |
| 172 | if path != dir { |
| 173 | events = append(events, FSEvent{Op: OpCreate, Path: path, IsDir: true}) |
| 174 | } |
| 175 | return nil |
| 176 | } |
| 177 | events = append(events, FSEvent{Op: OpCreate, Path: path, IsDir: false}) |
| 178 | return nil |
| 179 | }); walkErr != nil { |
| 180 | fw.logger.Warn(context.Background(), "failed to walk directory", |
| 181 | slog.F("dir", dir), slog.Error(walkErr)) |
| 182 | } |
| 183 | return events |
| 184 | } |
| 185 | |
| 186 | func translateEvent(ev fsnotify.Event) *FSEvent { |
| 187 | var op FSEventOp |