diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-04-04 09:29:59 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-04-04 09:29:59 +0200 |
commit | 730b66b6520f263af16f555d1d7be51205a8e51d (patch) | |
tree | ddad821969aa76ac5211b32ec045e138f51854ae | |
parent | 4f639d6bd5ea47a28005d722227660d076299243 (diff) |
commands: Handle mass content etc. edits in server mode
Fixes #4563
-rw-r--r-- | Gopkg.lock | 8 | ||||
-rw-r--r-- | Gopkg.toml | 4 | ||||
-rw-r--r-- | commands/commandeer.go | 17 | ||||
-rw-r--r-- | commands/hugo.go | 25 |
4 files changed, 45 insertions, 9 deletions
diff --git a/Gopkg.lock b/Gopkg.lock index 6b96deb67..90a1c9965 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -59,6 +59,12 @@ [[projects]] branch = "master" + name = "github.com/bep/debounce" + packages = ["."] + revision = "4d3a5ad34e592abc468ed5c6b2a23fcca372ebcd" + +[[projects]] + branch = "master" name = "github.com/bep/gitmap" packages = ["."] revision = "de8030ebafb76c6e84d50ee6d143382637c00598" @@ -424,6 +430,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "edb250b53926de21df1740c379c76351b7e9b110c96a77078a10ba69bf31a2d4" + inputs-digest = "49464f23053ef206ad23f65c511943ef50f188a1d0023db3ac5223051a3bba78" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index e14d6dc00..573a575ef 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -145,3 +145,7 @@ [[constraint]] name = "github.com/sanity-io/litter" version = "1.1.0" + +[[constraint]] + branch = "master" + name = "github.com/bep/debounce" diff --git a/commands/commandeer.go b/commands/commandeer.go index e96c97814..f7ac93efa 100644 --- a/commands/commandeer.go +++ b/commands/commandeer.go @@ -17,6 +17,7 @@ import ( "os" "path/filepath" "sync" + "time" "github.com/spf13/cobra" @@ -26,6 +27,7 @@ import ( "github.com/gohugoio/hugo/hugolib" + "github.com/bep/debounce" "github.com/gohugoio/hugo/common/types" "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/helpers" @@ -51,6 +53,9 @@ type commandeer struct { // We can do this only once. fsCreate sync.Once + // Used in cases where we get flooded with events in server mode. + debounce func(f func()) + serverPorts []int languages helpers.Languages @@ -90,10 +95,20 @@ func (c *commandeer) initFs(fs *hugofs.Fs) error { func newCommandeer(running bool, doWithCommandeer func(c *commandeer) error, subCmdVs ...*cobra.Command) (*commandeer, error) { + var rebuildDebouncer func(f func()) + if running { + // The time value used is tested with mass content replacements in a fairly big Hugo site. + // It is better to wait for some seconds in those cases rather than get flooded + // with rebuilds. + rebuildDebouncer, _ = debounce.New(4 * time.Second) + } + c := &commandeer{ doWithCommandeer: doWithCommandeer, subCmdVs: append([]*cobra.Command{hugoCmdV}, subCmdVs...), - visitedURLs: types.NewEvictingStringQueue(10)} + visitedURLs: types.NewEvictingStringQueue(10), + debounce: rebuildDebouncer, + } return c, c.loadConfig(running) } diff --git a/commands/hugo.go b/commands/hugo.go index ba8c0aef4..d0894a11a 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -851,6 +851,16 @@ func (c *commandeer) rebuildSites(events []fsnotify.Event) error { return Hugo.Build(hugolib.BuildCfg{RecentlyVisited: visited}, events...) } +func (c *commandeer) fullRebuild() { + if err := c.loadConfig(true); err != nil { + jww.ERROR.Println("Failed to reload config:", err) + } else if err := c.recreateAndBuildSites(true); err != nil { + jww.ERROR.Println(err) + } else if !buildWatch && !c.Cfg.GetBool("disableLiveReload") { + livereload.ForceRefresh() + } +} + // newWatcher creates a new watcher to watch filesystem events. func (c *commandeer) newWatcher(dirList ...string) (*watcher.Batcher, error) { if runtime.GOOS == "darwin" { @@ -887,6 +897,13 @@ func (c *commandeer) newWatcher(dirList ...string) (*watcher.Batcher, error) { for { select { case evs := <-watcher.Events: + if len(evs) > 50 { + // This is probably a mass edit of the content dir. + // Schedule a full rebuild for when it slows down. + c.debounce(c.fullRebuild) + continue + } + c.Logger.INFO.Println("Received System Events:", evs) staticEvents := []fsnotify.Event{} @@ -900,13 +917,7 @@ func (c *commandeer) newWatcher(dirList ...string) (*watcher.Batcher, error) { continue } // Config file changed. Need full rebuild. - if err := c.loadConfig(true); err != nil { - jww.ERROR.Println("Failed to reload config:", err) - } else if err := c.recreateAndBuildSites(true); err != nil { - jww.ERROR.Println(err) - } else if !buildWatch && !c.Cfg.GetBool("disableLiveReload") { - livereload.ForceRefresh() - } + c.fullRebuild() break } |