func main() { dev, _ := fsevents.DeviceForPath("/tmp") log.Print(dev) log.Println(fsevents.EventIDForDeviceBeforeTime(dev, time.Now())) es := &fsevents.EventStream{ Paths: []string{"/tmp"}, Latency: 500 * time.Millisecond, // Device: dev, Flags: fsevents.FileEvents | fsevents.WatchRoot} es.Start() ec := es.Events go func() { for msg := range ec { for _, event := range msg { logEvent(event) } } }() in := bufio.NewReader(os.Stdin) if false { log.Print("Started, press enter to GC") in.ReadString('\n') runtime.GC() log.Print("GC'd, press enter to quit") in.ReadString('\n') } else { log.Print("Started, press enter to stop") in.ReadString('\n') es.Stop() log.Print("Stopped, press enter to restart") in.ReadString('\n') es.Resume = true es.Start() log.Print("Restarted, press enter to quit") in.ReadString('\n') es.Stop() } }
func Watch(restart string, done <-chan struct{}, change func()) error { lastStat, err := os.Stat(restart) if err != nil { return err } dev, err := fsevents.DeviceForPath(restart) if err != nil { return err } es := &fsevents.EventStream{ Paths: []string{restart}, Latency: 500 * time.Millisecond, Device: dev, Flags: fsevents.FileEvents | fsevents.IgnoreSelf, } es.Start() defer es.Stop() for { select { case <-es.Events: cur, err := os.Stat(restart) if err != nil { return err } if cur.ModTime().After(lastStat.ModTime()) { change() } case <-done: return nil } } }