hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 45c74526686f6a2afa02bcee767d837d6b9dd028
parent e765b43e2bf3d017f8ae8fd4d455d7bd60e11973
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Wed, 12 Apr 2017 18:11:37 +0200

hugolib: Must recreate Paginator on live-reload

The structure may potentially have changed, and then it fails.

Fixes #3315

Diffstat:
Mhugolib/page_output.go | 15+++++++++++----
Mhugolib/site_render.go | 15+++++++--------
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/hugolib/page_output.go b/hugolib/page_output.go
@@ -78,13 +78,17 @@ func newPageOutput(p *Page, createCopy bool, f output.Format) (*PageOutput, erro
 
 // copy creates a copy of this PageOutput with the lazy sync.Once vars reset
 // so they will be evaluated again, for word count calculations etc.
-func (p *PageOutput) copy() *PageOutput {
-	c, err := newPageOutput(p.Page, true, p.outputFormat)
+func (p *PageOutput) copyWithFormat(f output.Format) (*PageOutput, error) {
+	c, err := newPageOutput(p.Page, true, f)
 	if err != nil {
-		panic(err)
+		return nil, err
 	}
 	c.paginator = p.paginator
-	return c
+	return c, nil
+}
+
+func (p *PageOutput) copy() (*PageOutput, error) {
+	return p.copyWithFormat(p.outputFormat)
 }
 
 func (p *PageOutput) layouts(layouts ...string) ([]string, error) {
@@ -142,6 +146,9 @@ func (p *Page) Render(layout ...string) template.HTML {
 	}
 
 	p.pageOutputInit.Do(func() {
+		if p.mainPageOutput != nil {
+			return
+		}
 		// If Render is called in a range loop, the page output isn't available.
 		// So, create one.
 		outFormat := p.outputFormats[0]
diff --git a/hugolib/site_render.go b/hugolib/site_render.go
@@ -75,14 +75,10 @@ func pageRenderer(s *Site, pages <-chan *Page, results chan<- error, wg *sync.Wa
 			)
 
 			if i == 0 {
-				page.pageOutputInit.Do(func() {
-					var po *PageOutput
-					po, err = newPageOutput(page, false, outFormat)
-					page.mainPageOutput = po
-				})
-				pageOutput = page.mainPageOutput
+				pageOutput, err = newPageOutput(page, false, outFormat)
+				page.mainPageOutput = pageOutput
 			} else {
-				pageOutput, err = newPageOutput(page, true, outFormat)
+				pageOutput, err = page.mainPageOutput.copyWithFormat(outFormat)
 			}
 
 			if err != nil {
@@ -159,7 +155,10 @@ func (s *Site) renderPaginator(p *PageOutput) error {
 				continue
 			}
 
-			pagerNode := p.copy()
+			pagerNode, err := p.copy()
+			if err != nil {
+				return err
+			}
 
 			pagerNode.paginator = pager
 			if pager.TotalPages() > 0 {