From 19084eaf74246feac61d618c55031369520dfa8e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 22 Apr 2018 11:18:39 +0200 Subject: [PATCH] hugolib: Init the content and shortcodes early In most cases we could delay the content init until rendering time, but there could be use cases where the templates would depend on state set in the shortcodes (.Page.Scratch.Set), so we need to do this early. See #4632 --- hugolib/hugo_sites.go | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go index bafb89e2..a0fe5d15 100644 --- a/hugolib/hugo_sites.go +++ b/hugolib/hugo_sites.go @@ -560,22 +560,40 @@ func (h *HugoSites) setupTranslations() { } func (s *Site) preparePagesForRender(cfg *BuildCfg) { + + pageChan := make(chan *Page) + wg := &sync.WaitGroup{} + + numWorkers := getGoMaxProcs() * 4 + + for i := 0; i < numWorkers; i++ { + wg.Add(1) + go func(pages <-chan *Page, wg *sync.WaitGroup) { + defer wg.Done() + for p := range pages { + p.setContentInit(cfg) + + // In most cases we could delay the content init until rendering time, + // but there could be use cases where the templates would depend + // on state set in the shortcodes (.Page.Scratch.Set), so we + // need to do this early. This will do the needed recursion. + p.initContent() + } + }(pageChan, wg) + } + for _, p := range s.Pages { - p.setContentInit(cfg) - // The skip render flag is used in many tests. To make sure that they - // have access to the content, we need to manually initialize it here. - if cfg.SkipRender { - p.initContent() - } + pageChan <- p } for _, p := range s.headlessPages { - p.setContentInit(cfg) - if cfg.SkipRender { - p.initContent() - } + pageChan <- p } + close(pageChan) + + wg.Wait() + } // Pages returns all pages for all sites. -- 2.30.2