mirror of
https://github.com/gohugoio/hugo.git
synced 2025-04-28 06:30:33 +03:00
Add a cross process build lock and use it in the archetype content builder
Fixes #9048
This commit is contained in:
parent
c7957c90e8
commit
ba35e69856
7 changed files with 79 additions and 32 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue