hugolib: Wrap pageOutput create in sync.Once
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 26 Mar 2017 09:45:12 +0000 (11:45 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 27 Mar 2017 13:43:56 +0000 (15:43 +0200)
hugolib/page.go
hugolib/page_output.go
hugolib/site_render.go
tpl/tplimpl/template.go

index 7dfc49faa85500c87799e16eb3f1df80192b2f05..84dfa2f430592ca6f525d555f6a5724fe2f69310 100644 (file)
@@ -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
index 20d051e8cd7b81687840b3815cd32a9f53797421..542c50e628f0808ada368ee4bfde7538fb0e6198 100644 (file)
@@ -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...)
 }
 
index 5f46bd0c9f9937274192e246fd98b2f7c163ce59..33060101328e191b1ac1dbe983f087517d8c7a26 100644 (file)
@@ -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
 
index 17cbb40f3bc8bbaeb599f6932ed72cb6505c58a6..545d5994aeeccd97f2c10460ed03c06b32515a90 100644 (file)
@@ -180,6 +180,7 @@ func (t *GoHTMLTemplate) executeTemplate(context interface{}, w io.Writer, layou
        for _, layout := range layouts {
                templ := t.Lookup(layout)
                if templ == nil {
+                       // TODO(bep) output
                        layout += ".html"
                        templ = t.Lookup(layout)
                }