shithub: hugo

Download patch

ref: d4f8f88e67f958b8010f90cb9b9854114e52dac2
parent: 4e524ffcfff48c017717e261c6067416aa56410f
author: Bjørn Erik Pedersen <[email protected]>
date: Mon Jan 15 05:02:17 EST 2018

commands: And now really fix the server watch logic

See #4275

--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -18,8 +18,10 @@
 import (
 	"fmt"
 	"io/ioutil"
+	"os/signal"
 	"sort"
 	"sync/atomic"
+	"syscall"
 
 	"golang.org/x/sync/errgroup"
 
@@ -547,7 +549,7 @@
 	})
 }
 
-func (c *commandeer) fullBuild(watches ...bool) error {
+func (c *commandeer) fullBuild() error {
 	var (
 		g         errgroup.Group
 		langCount map[string]uint64
@@ -611,10 +613,10 @@
 
 }
 
-func (c *commandeer) build(watches ...bool) error {
+func (c *commandeer) build() error {
 	defer c.timeTrack(time.Now(), "Total")
 
-	if err := c.fullBuild(watches...); err != nil {
+	if err := c.fullBuild(); err != nil {
 		return err
 	}
 
@@ -632,12 +634,36 @@
 		}
 		c.Logger.FEEDBACK.Println("Watching for changes in", c.PathSpec().AbsPathify(c.Cfg.GetString("contentDir")))
 		c.Logger.FEEDBACK.Println("Press Ctrl+C to stop")
-		utils.CheckErr(c.Logger, c.newWatcher(watchDirs...))
+		watcher, err := c.newWatcher(watchDirs...)
+		utils.CheckErr(c.Logger, err)
+		defer watcher.Close()
+
+		var sigs = make(chan os.Signal)
+		signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
+
+		<-sigs
 	}
 
 	return nil
 }
 
+func (c *commandeer) serverBuild() error {
+	defer c.timeTrack(time.Now(), "Total")
+
+	if err := c.fullBuild(); err != nil {
+		return err
+	}
+
+	// TODO(bep) Feedback?
+	if !quiet {
+		fmt.Println()
+		Hugo.PrintProcessingStats(os.Stdout)
+		fmt.Println()
+	}
+
+	return nil
+}
+
 func (c *commandeer) copyStatic() (map[string]uint64, error) {
 	return c.doWithPublishDirs(c.copyStaticTo)
 }
@@ -968,7 +994,7 @@
 }
 
 // newWatcher creates a new watcher to watch filesystem events.
-func (c *commandeer) newWatcher(dirList ...string) error {
+func (c *commandeer) newWatcher(dirList ...string) (*watcher.Batcher, error) {
 	if runtime.GOOS == "darwin" {
 		tweakLimit()
 	}
@@ -975,17 +1001,15 @@
 
 	staticSyncer, err := newStaticSyncer(c)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	watcher, err := watcher.New(1 * time.Second)
 
 	if err != nil {
-		return err
+		return nil, err
 	}
 
-	defer watcher.Close()
-
 	for _, d := range dirList {
 		if d != "" {
 			_ = watcher.Add(d)
@@ -1183,7 +1207,7 @@
 		}
 	}()
 
-	return nil
+	return watcher, nil
 }
 
 func pickOneWriteOrCreatePath(events []fsnotify.Event) string {
--- a/commands/server.go
+++ b/commands/server.go
@@ -202,7 +202,7 @@
 		return err
 	}
 
-	if err := c.build(serverWatch); err != nil {
+	if err := c.serverBuild(); err != nil {
 		return err
 	}
 
@@ -231,11 +231,13 @@
 		rootWatchDirs := strings.Join(helpers.UniqueStrings(helpers.ExtractRootPaths(relWatchDirs)), ",")
 
 		jww.FEEDBACK.Printf("Watching for changes in %s%s{%s}\n", baseWatchDir, helpers.FilePathSeparator, rootWatchDirs)
-		err = c.newWatcher(watchDirs...)
+		watcher, err := c.newWatcher(watchDirs...)
 
 		if err != nil {
 			return err
 		}
+
+		defer watcher.Close()
 
 	}