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  }