From 5def6d9aee659160d921bcbc1c9d98007a428d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Thu, 28 Jan 2016 15:31:25 +0100 Subject: [PATCH] Make the watch logger less chatty --- commands/hugo.go | 17 +++++++++-------- helpers/general.go | 21 ++++++++++++++++++++- hugolib/site.go | 16 +++++++++------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/commands/hugo.go b/commands/hugo.go index e95c4a5cd..42ae96c78 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -30,6 +30,7 @@ import ( "regexp" + "github.com/spf13/afero" "github.com/spf13/cobra" "github.com/spf13/fsync" "github.com/spf13/hugo/helpers" @@ -42,7 +43,6 @@ import ( "github.com/spf13/nitro" "github.com/spf13/viper" "gopkg.in/fsnotify.v1" - "github.com/spf13/afero" ) var mainSite *hugolib.Site @@ -654,7 +654,7 @@ func NewWatcher(port int) error { continue } - walkAdder := func (path string, f os.FileInfo, err error) error { + walkAdder := func(path string, f os.FileInfo, err error) error { if f.IsDir() { jww.FEEDBACK.Println("adding created directory to watchlist", path) watcher.Add(path) @@ -687,7 +687,7 @@ func NewWatcher(port int) error { publishDir = helpers.FilePathSeparator } - jww.FEEDBACK.Println("\n Static file changes detected") + jww.FEEDBACK.Println("\nStatic file changes detected") const layout = "2006-01-02 15:04 -0700" fmt.Println(time.Now().Format(layout)) @@ -710,6 +710,8 @@ func NewWatcher(port int) error { syncer.SrcFs = staticSourceFs syncer.DestFs = hugofs.DestinationFS + // prevent spamming the log on changes + logger := helpers.NewDistinctFeedbackLogger() for _, ev := range staticEvents { // Due to our approach of layering both directories and the content's rendered output @@ -727,7 +729,6 @@ func NewWatcher(port int) error { // Hugo assumes that these cases are very rare and will permit this bad behavior // The alternative is to track every single file and which pipeline rendered it // and then to handle conflict resolution on every event. - fmt.Println(ev) fromPath := ev.Name @@ -750,12 +751,12 @@ func NewWatcher(port int) error { if ev.Op&fsnotify.Rename == fsnotify.Rename || ev.Op&fsnotify.Remove == fsnotify.Remove { if _, err := staticSourceFs.Stat(relPath); os.IsNotExist(err) { // If file doesn't exist in any static dir, remove it - toRemove :=filepath.Join(publishDir, relPath) - jww.FEEDBACK.Println("File no longer exists in static dir, removing", toRemove) + toRemove := filepath.Join(publishDir, relPath) + logger.Println("File no longer exists in static dir, removing", toRemove) hugofs.DestinationFS.RemoveAll(toRemove) } else if err == nil { // If file still exists, sync it - jww.FEEDBACK.Println("Syncing", relPath, "to", publishDir) + logger.Println("Syncing", relPath, "to", publishDir) syncer.Sync(filepath.Join(publishDir, relPath), relPath) } else { jww.ERROR.Println(err) @@ -765,7 +766,7 @@ func NewWatcher(port int) error { } // For all other event operations Hugo will sync static. - jww.FEEDBACK.Println("Syncing", relPath, "to", publishDir) + logger.Println("Syncing", relPath, "to", publishDir) syncer.Sync(filepath.Join(publishDir, relPath), relPath) } } diff --git a/helpers/general.go b/helpers/general.go index 3126bf5ca..6ed95f8f4 100644 --- a/helpers/general.go +++ b/helpers/general.go @@ -182,6 +182,7 @@ func ThemeSet() bool { } type logPrinter interface { + // Println is the only common method that works in all of JWWs loggers. Println(a ...interface{}) } @@ -192,10 +193,23 @@ type DistinctLogger struct { m map[string]bool } +// Println will log the string returned from fmt.Sprintln given the arguments, +// but not if it has been logged before. +func (l *DistinctLogger) Println(v ...interface{}) { + // fmt.Sprint doesn't add space between string arguments + logStatement := strings.TrimSpace(fmt.Sprintln(v...)) + l.print(logStatement) +} + // Printf will log the string returned from fmt.Sprintf given the arguments, // but not if it has been logged before. +// Note: A newline is appended. func (l *DistinctLogger) Printf(format string, v ...interface{}) { logStatement := fmt.Sprintf(format, v...) + l.print(logStatement) +} + +func (l *DistinctLogger) print(logStatement string) { l.RLock() if l.m[logStatement] { l.RUnlock() @@ -207,7 +221,6 @@ func (l *DistinctLogger) Printf(format string, v ...interface{}) { if !l.m[logStatement] { l.logger.Println(logStatement) l.m[logStatement] = true - fmt.Println() } l.Unlock() } @@ -217,6 +230,12 @@ func NewDistinctErrorLogger() *DistinctLogger { return &DistinctLogger{m: make(map[string]bool), logger: jww.ERROR} } +// NewDistinctErrorLogger creates a new DistinctLogger that can be used +// to give feedback to the user while not spamming with duplicates. +func NewDistinctFeedbackLogger() *DistinctLogger { + return &DistinctLogger{m: make(map[string]bool), logger: &jww.FEEDBACK} +} + // Avoid spamming the logs with errors var DistinctErrorLog = NewDistinctErrorLogger() diff --git a/hugolib/site.go b/hugolib/site.go index 6c66aa837..03a16d99c 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -31,6 +31,7 @@ import ( "sync/atomic" "bitbucket.org/pkg/inflect" + "github.com/spf13/afero" "github.com/spf13/cast" bp "github.com/spf13/hugo/bufferpool" "github.com/spf13/hugo/helpers" @@ -44,7 +45,6 @@ import ( "github.com/spf13/nitro" "github.com/spf13/viper" "gopkg.in/fsnotify.v1" - "github.com/spf13/afero" ) var _ = transform.AbsURL @@ -438,19 +438,22 @@ func (s *Site) ReBuild(events []fsnotify.Event) error { var err error + // prevent spamming the log on changes + logger := helpers.NewDistinctFeedbackLogger() + for _, ev := range events { // Need to re-read source if strings.HasPrefix(ev.Name, s.absContentDir()) { - fmt.Println("Source changed", ev) + logger.Println("Source changed", ev.Name) sourceChanged = append(sourceChanged, ev) } if strings.HasPrefix(ev.Name, s.absLayoutDir()) || strings.HasPrefix(ev.Name, s.absThemeDir()) { - fmt.Println("Template changed", ev) + logger.Println("Template changed", ev.Name) tmplChanged = append(tmplChanged, ev) } if strings.HasPrefix(ev.Name, s.absDataDir()) { - fmt.Println("Data changed", ev) - dataChanged = append(dataChanged,ev) + logger.Println("Data changed", ev.Name) + dataChanged = append(dataChanged, ev) } } @@ -502,7 +505,7 @@ func (s *Site) ReBuild(events []fsnotify.Event) error { for _, ev := range sourceChanged { - if ev.Op&fsnotify.Remove == fsnotify.Remove { + if ev.Op&fsnotify.Remove == fsnotify.Remove { //remove the file & a create will follow path, _ := helpers.GetRelativePath(ev.Name, s.absContentDir()) s.RemovePageByPath(path) @@ -1027,7 +1030,6 @@ func (s *Site) AddPage(page *Page) { } } - func (s *Site) RemovePageByPath(path string) { if i := s.Pages.FindPagePosByFilePath(path); i >= 0 { page := s.Pages[i]