ref: 93b04e67f633e96484c29158cad00e86abe64c1e
parent: 804603155f775bbf1b03dbeadbb78f978af6c169
author: Bjørn Erik Pedersen <[email protected]>
date: Sun Feb 28 06:51:51 EST 2016
Create template clone for late template execution Fixing some breaking blogs on Go 1.6 Fixes #1879
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -595,6 +595,7 @@
if s.hasTheme() {
s.Tmpl.LoadTemplatesWithPrefix(s.absThemeDir()+"/layouts", "theme")
}
+ s.Tmpl.MarkReady()
}
func (s *Site) addTemplate(name, data string) error {
@@ -1366,11 +1367,15 @@
// this cannot be fanned out to multiple Go routines
// See issue #1601
// TODO(bep): Check the IsRenderable logic.
+
+ // Issue #1879
+ templ := s.Tmpl.Clone()
+
for _, p := range s.Pages {
var layouts []string
if !p.IsRenderable() {
self := "__" + p.TargetPath()
- _, err := s.Tmpl.New(self).Parse(string(p.Content))
+ _, err := templ.New(self).Parse(string(p.Content))
if err != nil {
results <- err
continue
--- a/tpl/template.go
+++ b/tpl/template.go
@@ -37,6 +37,7 @@
Lookup(name string) *template.Template
Templates() []*template.Template
New(name string) *template.Template
+ Clone() *template.Template
LoadTemplates(absPath string)
LoadTemplatesWithPrefix(absPath, prefix string)
AddTemplate(name, tpl string) error
@@ -43,6 +44,7 @@
AddAceTemplate(name, basePath, innerPath string, baseContent, innerContent []byte) error
AddInternalTemplate(prefix, name, tpl string) error
AddInternalShortcode(name, tpl string) error
+ MarkReady()
PrintErrors()
}
@@ -53,6 +55,8 @@
type GoHTMLTemplate struct {
template.Template
+ clone *template.Template
+ ready bool
errors []*templateErr
}
@@ -138,6 +142,22 @@
func (t *GoHTMLTemplate) LoadEmbedded() {
t.EmbedShortcodes()
t.EmbedTemplates()
+}
+
+// MarkReady marks the template as "ready for execution". No changes allowed
+// after this is set.
+func (t *GoHTMLTemplate) MarkReady() {
+ t.clone = template.Must(t.Template.Clone())
+ t.ready = true
+}
+
+// Since Go 1.6, the template cannot change once executed. So we have to create
+// a clone and work with that in some rare cases.
+func (t *GoHTMLTemplate) Clone() *template.Template {
+ if !t.ready {
+ panic("template clone called too early")
+ }
+ return template.Must(t.clone.Clone())
}
func (t *GoHTMLTemplate) AddInternalTemplate(prefix, name, tpl string) error {