summaryrefslogtreecommitdiffstats
path: root/commands
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-10-17 11:54:55 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-10-18 12:13:13 +0200
commitba35e69856900b6fc92681aa841cdcaefbb4b121 (patch)
treeb9ffc699a99b2d6d947e1d53c383a1352ce93980 /commands
parentc7957c90e83ff2b2cc958bd61486a244f0fd8891 (diff)
Add a cross process build lock and use it in the archetype content builder
Fixes #9048
Diffstat (limited to 'commands')
-rw-r--r--commands/hugo.go25
1 files changed, 16 insertions, 9 deletions
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)