commands: Fix server without watch
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 14 Jan 2018 19:58:52 +0000 (20:58 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 14 Jan 2018 19:58:52 +0000 (20:58 +0100)
This was broken in Hugo 0.30.

Fixes #4275

commands/hugo.go
commands/server.go

index 51375ea8a8395512a2cf8037e93971ca97c22cab..67ebc8512ea7d721898701d9528c2b358dbbb962 100644 (file)
@@ -30,7 +30,6 @@ import (
        "path/filepath"
        "runtime"
        "strings"
-       "sync"
        "time"
 
        src "github.com/gohugoio/hugo/source"
@@ -633,7 +632,7 @@ func (c *commandeer) build(watches ...bool) error {
                }
                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(false, watchDirs...))
+               utils.CheckErr(c.Logger, c.newWatcher(watchDirs...))
        }
 
        return nil
@@ -969,9 +968,7 @@ func (c *commandeer) rebuildSites(events []fsnotify.Event) error {
 }
 
 // newWatcher creates a new watcher to watch filesystem events.
-// if serve is set it will also start one or more HTTP servers to serve those
-// files.
-func (c *commandeer) newWatcher(serve bool, dirList ...string) error {
+func (c *commandeer) newWatcher(dirList ...string) error {
        if runtime.GOOS == "darwin" {
                tweakLimit()
        }
@@ -982,7 +979,6 @@ func (c *commandeer) newWatcher(serve bool, dirList ...string) error {
        }
 
        watcher, err := watcher.New(1 * time.Second)
-       var wg sync.WaitGroup
 
        if err != nil {
                return err
@@ -990,8 +986,6 @@ func (c *commandeer) newWatcher(serve bool, dirList ...string) error {
 
        defer watcher.Close()
 
-       wg.Add(1)
-
        for _, d := range dirList {
                if d != "" {
                        _ = watcher.Add(d)
@@ -1189,11 +1183,6 @@ func (c *commandeer) newWatcher(serve bool, dirList ...string) error {
                }
        }()
 
-       if serve {
-               go c.serve()
-       }
-
-       wg.Wait()
        return nil
 }
 
index 21137619df62f98cc66db60fb8b3e846e03045e3..b9f21783b6102e74a6f68785d1eacac4dfde03e2 100644 (file)
@@ -19,10 +19,12 @@ import (
        "net/http"
        "net/url"
        "os"
+       "os/signal"
        "path/filepath"
        "runtime"
        "strconv"
        "strings"
+       "syscall"
        "time"
 
        "github.com/gohugoio/hugo/livereload"
@@ -229,14 +231,16 @@ func server(cmd *cobra.Command, args []string) error {
                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(true, watchDirs...)
+               err = c.newWatcher(watchDirs...)
 
                if err != nil {
                        return err
                }
+
        }
 
-       return nil
+       return c.serve()
+
 }
 
 type fileServer struct {
@@ -313,7 +317,7 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, erro
        return mu, u.String(), endpoint, nil
 }
 
-func (c *commandeer) serve() {
+func (c *commandeer) serve() error {
 
        isMultiHost := Hugo.IsMultihost()
 
@@ -345,6 +349,9 @@ func (c *commandeer) serve() {
                livereload.Initialize()
        }
 
+       var sigs = make(chan os.Signal)
+       signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
+
        for i, _ := range baseURLs {
                mu, serverURL, endpoint, err := srv.createEndpoint(i)
 
@@ -363,6 +370,10 @@ func (c *commandeer) serve() {
        }
 
        jww.FEEDBACK.Println("Press Ctrl+C to stop")
+
+       <-sigs
+
+       return nil
 }
 
 // fixURL massages the baseURL into a form needed for serving