github.com/mutagen-io/mutagen@v0.18.0-rc1/tools/watch_demo/watch_demo.go (about) 1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 "os" 7 "os/signal" 8 9 "github.com/mutagen-io/mutagen/cmd" 10 11 "github.com/mutagen-io/mutagen/pkg/filesystem/watching" 12 ) 13 14 func main() { 15 // Parse arguments. 16 if len(os.Args) != 2 { 17 cmd.Fatal(errors.New("invalid number of arguments")) 18 } 19 watchRoot := os.Args[1] 20 21 // Track termination signals. 22 signalTermination := make(chan os.Signal, 1) 23 signal.Notify(signalTermination, cmd.TerminationSignals...) 24 25 // Create the best available watcher. 26 // 27 // HACK: We take advantage of the fact that NonRecursiveWatcher implements a 28 // superset of the RecursiveWatcher interface (albeit with vastly different, 29 // but compatible (for our purposes) semantics), so we can track whatever 30 // watcher we establish as a RecursiveWatcher. 31 var watcher watching.RecursiveWatcher 32 if watching.RecursiveWatchingSupported { 33 if w, err := watching.NewRecursiveWatcher(watchRoot); err != nil { 34 cmd.Fatal(fmt.Errorf("unable to establish recursive watch: %w", err)) 35 } else { 36 watcher = w 37 fmt.Println("Watching", watchRoot, "with recursive watching") 38 } 39 } else if watching.NonRecursiveWatchingSupported { 40 if w, err := watching.NewNonRecursiveWatcher(); err != nil { 41 cmd.Fatal(fmt.Errorf("unable to establish non-recursive watch: %w", err)) 42 } else { 43 w.Watch(watchRoot) 44 watcher = w 45 fmt.Println("Watching", watchRoot, "with non-recursive watching") 46 } 47 } else { 48 cmd.Fatal(errors.New("no supported watching mechanism")) 49 } 50 51 // Print events and their paths until watching has terminated. 52 for { 53 select { 54 case path := <-watcher.Events(): 55 fmt.Printf("\"%s\"\n", path) 56 case err := <-watcher.Errors(): 57 cmd.Fatal(fmt.Errorf("watching failed: %w", err)) 58 case <-signalTermination: 59 fmt.Println("Received termination signal, terminating watching...") 60 watcher.Terminate() 61 } 62 } 63 }