URI: 
       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())
                }
        }