shithub: hugo

Download patch

ref: 4e524ffcfff48c017717e261c6067416aa56410f
parent: 64f0e9d1c1d4ff2249fd9cf9749e70485002b36d
author: Bjørn Erik Pedersen <[email protected]>
date: Sun Jan 14 15:58:52 EST 2018

commands: Fix server without watch

This was broken in Hugo 0.30.

Fixes #4275

--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -30,7 +30,6 @@
 	"path/filepath"
 	"runtime"
 	"strings"
-	"sync"
 	"time"
 
 	src "github.com/gohugoio/hugo/source"
@@ -633,7 +632,7 @@
 		}
 		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 @@
 }
 
 // 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 @@
 	}
 
 	watcher, err := watcher.New(1 * time.Second)
-	var wg sync.WaitGroup
 
 	if err != nil {
 		return err
@@ -990,8 +986,6 @@
 
 	defer watcher.Close()
 
-	wg.Add(1)
-
 	for _, d := range dirList {
 		if d != "" {
 			_ = watcher.Add(d)
@@ -1189,11 +1183,6 @@
 		}
 	}()
 
-	if serve {
-		go c.serve()
-	}
-
-	wg.Wait()
 	return nil
 }
 
--- a/commands/server.go
+++ b/commands/server.go
@@ -19,10 +19,12 @@
 	"net/http"
 	"net/url"
 	"os"
+	"os/signal"
 	"path/filepath"
 	"runtime"
 	"strconv"
 	"strings"
+	"syscall"
 	"time"
 
 	"github.com/gohugoio/hugo/livereload"
@@ -229,14 +231,16 @@
 		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 @@
 	return mu, u.String(), endpoint, nil
 }
 
-func (c *commandeer) serve() {
+func (c *commandeer) serve() error {
 
 	isMultiHost := Hugo.IsMultihost()
 
@@ -345,6 +349,9 @@
 		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 @@
 	}
 
 	jww.FEEDBACK.Println("Press Ctrl+C to stop")
+
+	<-sigs
+
+	return nil
 }
 
 // fixURL massages the baseURL into a form needed for serving