From ba35e69856900b6fc92681aa841cdcaefbb4b121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 17 Oct 2021 11:54:55 +0200 Subject: Add a cross process build lock and use it in the archetype content builder Fixes #9048 --- commands/hugo.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'commands') diff --git a/commands/hugo.go b/commands/hugo.go index c19756008..fbe2349a0 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -278,7 +278,8 @@ func isTerminal() bool { return terminal.IsTerminal(os.Stdout) } -func (c *commandeer) fullBuild() error { +func (c *commandeer) fullBuild(noBuildLock bool) error { + var ( g errgroup.Group langCount map[string]uint64 @@ -303,7 +304,7 @@ func (c *commandeer) fullBuild() error { return nil } buildSitesFunc := func() error { - if err := c.buildSites(); err != nil { + if err := c.buildSites(noBuildLock); err != nil { return errors.Wrap(err, "Error building site") } return nil @@ -496,7 +497,7 @@ func (c *commandeer) build() error { } }() - if err := c.fullBuild(); err != nil { + if err := c.fullBuild(false); err != nil { return err } @@ -551,7 +552,7 @@ func (c *commandeer) serverBuild() error { } }() - if err := c.fullBuild(); err != nil { + if err := c.fullBuild(false); err != nil { return err } @@ -721,8 +722,8 @@ func (c *commandeer) getDirList() ([]string, error) { return filenames, nil } -func (c *commandeer) buildSites() (err error) { - return c.hugo().Build(hugolib.BuildCfg{}) +func (c *commandeer) buildSites(noBuildLock bool) (err error) { + return c.hugo().Build(hugolib.BuildCfg{NoBuildLock: noBuildLock}) } func (c *commandeer) handleBuildErr(err error, msg string) { @@ -750,7 +751,7 @@ func (c *commandeer) rebuildSites(events []fsnotify.Event) error { visited[home] = true } } - return c.hugo().Build(hugolib.BuildCfg{RecentlyVisited: visited, ErrRecovery: c.wasError}, events...) + return c.hugo().Build(hugolib.BuildCfg{NoBuildLock: true, RecentlyVisited: visited, ErrRecovery: c.wasError}, events...) } func (c *commandeer) partialReRender(urls ...string) error { @@ -762,7 +763,7 @@ func (c *commandeer) partialReRender(urls ...string) error { for _, url := range urls { visited[url] = true } - return c.hugo().Build(hugolib.BuildCfg{RecentlyVisited: visited, PartialReRender: true, ErrRecovery: c.wasError}) + return c.hugo().Build(hugolib.BuildCfg{NoBuildLock: true, RecentlyVisited: visited, PartialReRender: true, ErrRecovery: c.wasError}) } func (c *commandeer) fullRebuild(changeType string) { @@ -809,7 +810,7 @@ func (c *commandeer) fullRebuild(changeType string) { return } - err = c.buildSites() + err = c.buildSites(true) if err != nil { c.logger.Errorln(err) } else if !c.h.buildWatch && !c.Cfg.GetBool("disableLiveReload") { @@ -864,11 +865,17 @@ func (c *commandeer) newWatcher(pollIntervalStr string, dirList ...string) (*wat for { select { case evs := <-watcher.Events: + unlock, err := c.hugo().BaseFs.LockBuild() + if err != nil { + c.logger.Errorln("Failed to acquire a build lock: %s", err) + return + } c.handleEvents(watcher, staticSyncer, evs, configSet) if c.showErrorInBrowser && c.errCount() > 0 { // Need to reload browser to show the error livereload.ForceRefresh() } + unlock() case err := <-watcher.Errors(): if err != nil && !os.IsNotExist(err) { c.logger.Errorln("Error while watching:", err) -- cgit v1.2.3