diff --git a/Gopkg.lock b/Gopkg.lock index a334fdf..b121158 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -25,6 +25,15 @@ revision = "02e3cf038dcea8290e44424da473dd12be796a8a" version = "v1.0.3" +[[projects]] + branch = "master" + name = "github.com/mattn/go-zglob" + packages = [ + ".", + "fastwalk" + ] + revision = "49693fbb3fe3c3a75fc4e4d6fb1d7cedcbdeb385" + [[projects]] name = "github.com/urfave/cli" packages = ["."] @@ -40,6 +49,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "bd09f9274a4112aeb869a026bcf3ab61443289a245d3d353da6623f3327e7b4e" + inputs-digest = "01046dcc133438d0c6e244499b12395a2ef02264beec4752652b8c78c571a08e" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index f10c7e9..77b0d63 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -13,3 +13,7 @@ [prune] go-tests = true unused-packages = true + +[[constraint]] + branch = "master" + name = "github.com/mattn/go-zglob" diff --git a/loggger.go b/loggger.go index 8d92b0d..9616151 100644 --- a/loggger.go +++ b/loggger.go @@ -40,6 +40,13 @@ func (l *Logger) Debug(v ...interface{}) { } } +// Debugf ... +func (l *Logger) Debugf(format string, v ...interface{}) { + if l.verbose { + l.logDebug.Printf(format, v...) + } +} + // Warn ... func (l *Logger) Warn(v ...interface{}) { l.logWarn.Println(v...) diff --git a/main.go b/main.go index e7f0c9b..f1607a0 100644 --- a/main.go +++ b/main.go @@ -162,7 +162,10 @@ func runGaper(cfg *Config) error { return fmt.Errorf("run error: %v", err) } - watcher := NewWatcher(cfg.PollInterval, cfg.WatchItems, cfg.IgnoreItems, cfg.Extensions) + watcher, err := NewWatcher(cfg.PollInterval, cfg.WatchItems, cfg.IgnoreItems, cfg.Extensions) + if err != nil { + return fmt.Errorf("watcher error: %v", err) + } go watcher.Watch() for { diff --git a/watcher.go b/watcher.go index 9dfc315..44e8351 100644 --- a/watcher.go +++ b/watcher.go @@ -2,9 +2,12 @@ package main import ( "errors" + "fmt" "os" "path/filepath" "time" + + zglob "github.com/mattn/go-zglob" ) // Watcher ... @@ -18,27 +21,37 @@ type Watcher struct { } // NewWatcher ... -func NewWatcher(pollInterval int, watchItems []string, ignoreItems []string, extensions []string) *Watcher { +func NewWatcher(pollInterval int, watchItems []string, ignoreItems []string, extensions []string) (*Watcher, error) { allowedExts := make(map[string]bool) for _, ext := range extensions { allowedExts["."+ext] = true } + watchMatches, err := resolveGlobMatches(watchItems) + if err != nil { + return nil, err + } + + ignoreMatches, err := resolveGlobMatches(ignoreItems) + if err != nil { + return nil, err + } + return &Watcher{ Events: make(chan string), Errors: make(chan error), PollInterval: pollInterval, - WatchItems: watchItems, - IgnoreItems: ignoreItems, + WatchItems: watchMatches, + IgnoreItems: ignoreMatches, AllowedExtensions: allowedExts, - } + }, nil } var startTime = time.Now() var errDetectedChange = errors.New("done") // Watch ... -func (w *Watcher) Watch() { // nolint: gocyclo +func (w *Watcher) Watch() { for { for i := range w.WatchItems { fileChanged, err := w.scanChange(w.WatchItems[i]) @@ -93,3 +106,19 @@ func (w *Watcher) scanChange(watchPath string) (string, error) { return fileChanged, nil } + +func resolveGlobMatches(paths []string) ([]string, error) { + var result []string + + for _, path := range paths { + matches, err := zglob.Glob(path) + if err != nil { + return nil, fmt.Errorf("couldn't resolve glob path %s: %v", path, err) + } + + logger.Debugf("Resolved glob path %s: %v", path, matches) + result = append(result, matches...) + } + + return result, nil +}