if e, ok := events[runtime.GOOS]; ok {
return e
}
+ switch runtime.GOOS {
+ case "freebsd", "netbsd", "openbsd", "dragonfly", "darwin":
+ if e, ok := events["kqueue"]; ok {
+ return e
+ }
+ }
return events[""]
}
windows:
create /renamed
`},
+
+ {"rename watched directory", func(t *testing.T, w *Watcher, tmp string) {
+ addWatch(t, w, tmp)
+
+ dir := filepath.Join(tmp, "dir")
+ mkdir(t, dir)
+ addWatch(t, w, dir)
+
+ mv(t, dir, tmp, "dir-renamed")
+ touch(t, tmp, "dir-renamed/file")
+ }, `
+ CREATE "/dir" # mkdir
+ RENAME "/dir" # mv
+ CREATE "/dir-renamed"
+ RENAME "/dir"
+ CREATE "/dir/file" # touch
+
+ windows:
+ CREATE "/dir" # mkdir
+ RENAME "/dir" # mv
+ CREATE "/dir-renamed"
+ CREATE "/dir-renamed/file" # touch
+
+ # TODO: no results for the touch; this is probably a bug; windows
+ # was fixed in #370.
+ kqueue:
+ CREATE "/dir" # mkdir
+ CREATE "/dir-renamed" # mv
+ REMOVE|RENAME "/dir"
+ `},
}
for _, tt := range tests {
"path/filepath"
"reflect"
"runtime"
+ "strings"
"sync"
"syscall"
"unsafe"
case syscall.FILE_ACTION_RENAMED_OLD_NAME:
watch.rename = name
case syscall.FILE_ACTION_RENAMED_NEW_NAME:
+ // Update saved path of all sub-watches.
+ old := filepath.Join(watch.path, watch.rename)
+ w.mu.Lock()
+ for _, watchMap := range w.watches {
+ for _, ww := range watchMap {
+ if strings.HasPrefix(ww.path, old) {
+ ww.path = filepath.Join(fullname, strings.TrimPrefix(ww.path, old))
+ }
+ }
+ }
+ w.mu.Unlock()
+
if watch.names[watch.rename] != 0 {
watch.names[name] |= watch.names[watch.rename]
delete(watch.names, watch.rename)