summaryrefslogtreecommitdiffstats
path: root/hugolib
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-26 11:45:12 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-27 15:43:56 +0200
commit9a0aa5fdbe3ef35b7cc1dd756f54f1b219225bfc (patch)
treecac18524ff403396098d3b4e7a3cae472d57c51e /hugolib
parent0aaf3c56a511c6582db4dbfb28879e964e6f2d92 (diff)
hugolib: Wrap pageOutput create in sync.Once
Diffstat (limited to 'hugolib')
-rw-r--r--hugolib/page.go1
-rw-r--r--hugolib/page_output.go15
-rw-r--r--hugolib/site_render.go21
3 files changed, 31 insertions, 6 deletions
diff --git a/hugolib/page.go b/hugolib/page.go
index 7dfc49faa..84dfa2f43 100644
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -244,6 +244,7 @@ type pageInit struct {
languageInit sync.Once
pageMenusInit sync.Once
pageMetaInit sync.Once
+ pageOutputInit sync.Once
plainInit sync.Once
plainWordsInit sync.Once
renderingConfigInit sync.Once
diff --git a/hugolib/page_output.go b/hugolib/page_output.go
index 20d051e8c..542c50e62 100644
--- a/hugolib/page_output.go
+++ b/hugolib/page_output.go
@@ -108,6 +108,21 @@ func (p *PageOutput) Render(layout ...string) template.HTML {
// TODO(bep) output
func (p *Page) Render(layout ...string) template.HTML {
+ p.pageOutputInit.Do(func() {
+ // If Render is called in a range loop, the page output isn't available.
+ // So, create one.
+ outFormat := p.outputFormats[0]
+ pageOutput, err := newPageOutput(p, true, outFormat)
+
+ if err != nil {
+ p.s.Log.ERROR.Printf("Failed to create output page for type %q for page %q: %s", outFormat.Name, p, err)
+ return
+ }
+
+ p.mainPageOutput = pageOutput
+
+ })
+
return p.mainPageOutput.Render(layout...)
}
diff --git a/hugolib/site_render.go b/hugolib/site_render.go
index 5f46bd0c9..330601013 100644
--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -60,22 +60,31 @@ func (s *Site) renderPages() error {
func pageRenderer(s *Site, pages <-chan *Page, results chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
- var mainPageOutput *PageOutput
for page := range pages {
for i, outFormat := range page.outputFormats {
- pageOutput, err := newPageOutput(page, i > 0, outFormat)
+ var (
+ pageOutput *PageOutput
+ err error
+ )
+
+ if i == 0 {
+ page.pageOutputInit.Do(func() {
+ var po *PageOutput
+ po, err = newPageOutput(page, false, outFormat)
+ page.mainPageOutput = po
+ })
+ pageOutput = page.mainPageOutput
+ } else {
+ pageOutput, err = newPageOutput(page, true, outFormat)
+ }
if err != nil {
s.Log.ERROR.Printf("Failed to create output page for type %q for page %q: %s", outFormat.Name, page, err)
continue
}
- if i == 0 {
- mainPageOutput = pageOutput
- }
- page.mainPageOutput = mainPageOutput
var layouts []string