tpl, hugolib: Fix live-reload of non-renderable content pages - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit 2cbdd65330a727ae172b11b4b9dc96f675e1bb19
DIR parent 4e77c8717b18b8b54f4e56cb305da6cf3bc26be7
HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date: Tue, 21 Feb 2017 13:55:08 +0100
tpl, hugolib: Fix live-reload of non-renderable content pages
Fixes #3062
Diffstat:
M hugolib/hugo_sites_build.go | 7 +++++++
M hugolib/site.go | 1 +
M tpl/template.go | 1 +
M tpl/tplimpl/template.go | 16 ++++++++++++++--
4 files changed, 23 insertions(+), 2 deletions(-)
---
DIR diff --git 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()
}
DIR diff --git 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 {
DIR diff --git 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
DIR diff --git 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())
}
}