commands: Fix broken server-reload on config changes
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 28 Jun 2018 10:20:03 +0000 (12:20 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 28 Jun 2018 12:08:52 +0000 (14:08 +0200)
This was accidently broken in Hugo 0.42.

Fixes #4878

commands/commandeer.go
commands/hugo.go
commands/server.go

index d5d2740bf3ac897c58c2ced660862e7721cae4c6..4ca0c4be9b212889df04ed22f8684ea600a2ce87 100644 (file)
@@ -37,23 +37,27 @@ import (
        "github.com/gohugoio/hugo/langs"
 )
 
-type commandeer struct {
+type commandeerHugoState struct {
        *deps.DepsCfg
+       hugo     *hugolib.HugoSites
+       fsCreate sync.Once
+}
 
-       hugo *hugolib.HugoSites
+type commandeer struct {
+       *commandeerHugoState
+
+       // We need to reuse this on server rebuilds.
+       destinationFs afero.Fs
 
        h    *hugoBuilderCommon
        ftch flagsToConfigHandler
 
        visitedURLs *types.EvictingStringQueue
 
-       // We watch these for changes.
-       configFiles []string
-
        doWithCommandeer func(c *commandeer) error
 
-       // We can do this only once.
-       fsCreate sync.Once
+       // We watch these for changes.
+       configFiles []string
 
        // Used in cases where we get flooded with events in server mode.
        debounce func(f func())
@@ -73,6 +77,7 @@ func (c *commandeer) Set(key string, value interface{}) {
 }
 
 func (c *commandeer) initFs(fs *hugofs.Fs) error {
+       c.destinationFs = fs.Destination
        c.DepsCfg.Fs = fs
 
        return nil
@@ -89,11 +94,12 @@ func newCommandeer(mustHaveConfigFile, running bool, h *hugoBuilderCommon, f fla
        }
 
        c := &commandeer{
-               h:                h,
-               ftch:             f,
-               doWithCommandeer: doWithCommandeer,
-               visitedURLs:      types.NewEvictingStringQueue(10),
-               debounce:         rebuildDebouncer,
+               h:                   h,
+               ftch:                f,
+               commandeerHugoState: &commandeerHugoState{},
+               doWithCommandeer:    doWithCommandeer,
+               visitedURLs:         types.NewEvictingStringQueue(10),
+               debounce:            rebuildDebouncer,
        }
 
        return c, c.loadConfig(mustHaveConfigFile, running)
@@ -188,8 +194,11 @@ func (c *commandeer) loadConfig(mustHaveConfigFile, running bool) error {
        c.fsCreate.Do(func() {
                fs := hugofs.NewFrom(sourceFs, config)
 
-               // Hugo writes the output to memory instead of the disk.
-               if createMemFs {
+               if c.destinationFs != nil {
+                       // Need to reuse the destination on server rebuilds.
+                       fs.Destination = c.destinationFs
+               } else if createMemFs {
+                       // Hugo writes the output to memory instead of the disk.
                        fs.Destination = new(afero.MemMapFs)
                }
 
index 5c87bd96e3e31a470bcb49c0b47eaa6c8e3a31e4..2b847ec95ea0b55bba05677b683e63fbae2d0d83 100644 (file)
@@ -596,14 +596,6 @@ func (c *commandeer) getDirList() ([]string, error) {
        return a, nil
 }
 
-func (c *commandeer) recreateAndBuildSites(watching bool) (err error) {
-       defer c.timeTrack(time.Now(), "Total")
-       if !c.h.quiet {
-               c.Logger.FEEDBACK.Println("Started building sites ...")
-       }
-       return c.hugo.Build(hugolib.BuildCfg{CreateSitesFromConfig: true})
-}
-
 func (c *commandeer) resetAndBuildSites() (err error) {
        if !c.h.quiet {
                c.Logger.FEEDBACK.Println("Started building sites ...")
@@ -637,9 +629,10 @@ func (c *commandeer) rebuildSites(events []fsnotify.Event) error {
 }
 
 func (c *commandeer) fullRebuild() {
+       c.commandeerHugoState = &commandeerHugoState{}
        if err := c.loadConfig(true, true); err != nil {
                jww.ERROR.Println("Failed to reload config:", err)
-       } else if err := c.recreateAndBuildSites(true); err != nil {
+       } else if err := c.buildSites(); err != nil {
                jww.ERROR.Println(err)
        } else if !c.h.buildWatch && !c.Cfg.GetBool("disableLiveReload") {
                livereload.ForceRefresh()
index 8089b0ade75305d02b84874f96b9e01e4d613dd5..fde881f6f4d98a758c1f3f246c4e0bf13a33a1c4 100644 (file)
@@ -298,7 +298,7 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, erro
                }
        }
 
-       httpFs := afero.NewHttpFs(f.c.Fs.Destination)
+       httpFs := afero.NewHttpFs(f.c.destinationFs)
        fs := filesOnlyFs{httpFs.Dir(absPublishDir)}
 
        doLiveReload := !f.s.buildWatch && !f.c.Cfg.GetBool("disableLiveReload")