diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go index ce2c3b941..2e54cb7a8 100644 --- a/hugolib/hugo_sites_build.go +++ b/hugolib/hugo_sites_build.go @@ -107,6 +107,13 @@ func (h *HugoSites) initRebuild(config *BuildCfg) error { h.runMode.Watching = config.Watching + if config.whatChanged.source { + // This is for the non-renderable content pages (rarely used, I guess). + // We could maybe detect if this is really needed, but it should be + // pretty fast. + h.Tmpl.RebuildClone() + } + for _, s := range h.Sites { s.resetBuildState() } diff --git a/hugolib/site.go b/hugolib/site.go index cbb031680..b369e514a 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -1571,6 +1571,7 @@ func (s *Site) resetBuildState() { s.Info.paginationPageCount = 0 s.draftCount = 0 s.futureCount = 0 + s.expiredCount = 0 for _, p := range s.rawAllPages { diff --git a/tpl/template.go b/tpl/template.go index aaf7fc8c7..b94fc3242 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -13,6 +13,7 @@ type Template interface { Templates() []*template.Template New(name string) *template.Template GetClone() *template.Template + RebuildClone() *template.Template LoadTemplates(absPath string) LoadTemplatesWithPrefix(absPath, prefix string) AddTemplate(name, tpl string) error diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go index cf1fc5620..012319104 100644 --- a/tpl/tplimpl/template.go +++ b/tpl/tplimpl/template.go @@ -44,7 +44,12 @@ type templateErr struct { type GoHTMLTemplate struct { *template.Template - clone *template.Template + // This looks, and is, strange. + // The clone is used by non-renderable content pages, and these need to be + // re-parsed on content change, and to avoid the + // "cannot Parse after Execute" error, we need to re-clone it from the original clone. + clone *template.Template + cloneClone *template.Template // a separate storage for the overlays created from cloned master templates. // note: No mutex protection, so we add these in one Go routine, then just read. @@ -66,7 +71,6 @@ var DefaultTemplateProvider *TemplateProvider // Update updates the Hugo Template System in the provided Deps. // with all the additional features, templates & functions func (*TemplateProvider) Update(deps *deps.Deps) error { - // TODO(bep) check that this isn't called too many times. tmpl := &GoHTMLTemplate{ Template: template.New(""), overlays: make(map[string]*template.Template), @@ -229,6 +233,11 @@ func (t *GoHTMLTemplate) GetClone() *template.Template { return t.clone } +func (t *GoHTMLTemplate) RebuildClone() *template.Template { + t.clone = template.Must(t.cloneClone.Clone()) + return t.clone +} + func (t *GoHTMLTemplate) LoadEmbedded() { t.EmbedShortcodes() t.EmbedTemplates() @@ -236,9 +245,12 @@ func (t *GoHTMLTemplate) LoadEmbedded() { // MarkReady marks the template as "ready for execution". No changes allowed // after this is set. +// TODO(bep) if this proves to be resource heavy, we could detect +// earlier if we really need this, or make it lazy. func (t *GoHTMLTemplate) MarkReady() { if t.clone == nil { t.clone = template.Must(t.Template.Clone()) + t.cloneClone = template.Must(t.clone.Clone()) } }