Fix server reload when non-HTML shortcode changes
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 3 Jul 2020 16:02:32 +0000 (18:02 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 3 Jul 2020 21:31:51 +0000 (23:31 +0200)
Fixes #7448

hugolib/hugo_sites.go
hugolib/hugo_sites_rebuild_test.go
hugolib/shortcode.go
tpl/collections/apply_test.go
tpl/template.go
tpl/tplimpl/template.go

index ee0d5c563688e0fdee2b365317bfa30fe28a9409..d1e3a146d6d1c8ee46eb8c3115e51c209a250f3b 100644 (file)
@@ -981,14 +981,17 @@ func (h *HugoSites) resetPageStateFromEvents(idset identity.Identities) {
                }
 
                for _, s := range p.shortcodeState.shortcodes {
-                       for id := range idset {
-                               if idm, ok := s.info.(identity.Manager); ok && idm.Search(id) != nil {
-                                       for _, po := range p.pageOutputs {
-                                               if po.cp != nil {
-                                                       po.cp.Reset()
+                       for _, templ := range s.templs {
+                               sid := templ.(identity.Manager)
+                               for id := range idset {
+                                       if sid.Search(id) != nil {
+                                               for _, po := range p.pageOutputs {
+                                                       if po.cp != nil {
+                                                               po.cp.Reset()
+                                                       }
                                                }
+                                               return false
                                        }
-                                       return false
                                }
                        }
                }
index 1f0b1b5d9f5a14f55b4b4e93f9a729f39abcf03e..f0c9f8f09e508bd3f39b0e9af076490e278f1e98 100644 (file)
@@ -26,6 +26,7 @@ baseURL = "https://example.com"
 title = "Rebuild this"
 contentDir = "content"
 enableInlineShortcodes = true
+timeout = "5s"
 
 
 `
@@ -213,6 +214,46 @@ prender: {{ $p.Title }}|{{ $p.Content }}
 
                b.AssertFileContent("public/index.html", `
 Render /prender/: Baseof:Single Main: Page 1|Mypartial1: Mypartial1|Mypartial3: Mypartial3 Edited:END
+`)
+
+       })
+
+       t.Run("Edit RSS shortcode", func(t *testing.T) {
+               b := createSiteBuilder(t)
+
+               b.WithContent("output.md", `---
+title: Output
+outputs: ["HTML", "AMP"]
+layout: output
+---
+
+Content for Output.
+
+{{< output >}}
+
+`)
+
+               b.WithTemplates(
+                       "layouts/_default/output.html", `Output HTML: {{ .RelPermalink }}|{{ .Content }}`,
+                       "layouts/_default/output.amp.html", `Output AMP: {{ .RelPermalink }}|{{ .Content }}`,
+                       "layouts/shortcodes/output.html", `Output Shortcode HTML`,
+                       "layouts/shortcodes/output.amp.html", `Output Shortcode AMP`)
+
+               b.Build(BuildCfg{})
+
+               b.AssertFileContent("public/output/index.html", `
+Output Shortcode HTML
+`)
+               b.AssertFileContent("public/amp/output/index.html", `
+Output Shortcode AMP
+`)
+
+               b.EditFiles("layouts/shortcodes/output.amp.html", `Output Shortcode AMP Edited`)
+
+               b.Build(BuildCfg{})
+
+               b.AssertFileContent("public/amp/output/index.html", `
+Output Shortcode AMP Edited
 `)
 
        })
index f5413a9322b547582fe9a8c02d0d83a61ce82d4f..366c9971c4fd3326a53f3dbfb31086498b1d5423 100644 (file)
@@ -176,7 +176,8 @@ type shortcode struct {
        ordinal   int
        err       error
 
-       info tpl.Info
+       info   tpl.Info       // One of the output formats (arbitrary)
+       templs []tpl.Template // All output formats
 
        // If set, the rendered shortcode is sent as part of the surrounding content
        // to Blackfriday and similar.
@@ -541,15 +542,14 @@ Loop:
 
                        sc.name = currItem.ValStr()
 
-                       // Check if the template expects inner content.
-                       // We pick the first template for an arbitrary output format
-                       // if more than one. It is "all inner or no inner".
-                       tmpl, found, _ := s.s.Tmpl().LookupVariant(sc.name, tpl.TemplateVariants{})
-                       if !found {
+                       // Used to check if the template expects inner content.
+                       templs := s.s.Tmpl().LookupVariants(sc.name)
+                       if templs == nil {
                                return nil, _errors.Errorf("template for shortcode %q not found", sc.name)
                        }
 
-                       sc.info = tmpl.(tpl.Info)
+                       sc.info = templs[0].(tpl.Info)
+                       sc.templs = templs
                case currItem.IsInlineShortcodeName():
                        sc.name = currItem.ValStr()
                        sc.isInline = true
index 0d06f52e80060cc6604bd359cf39b35c1a9613b0..f9199b6b673ec89010c85e8fb1bbf5e6cd4c42af 100644 (file)
@@ -40,6 +40,10 @@ func (templateFinder) LookupVariant(name string, variants tpl.TemplateVariants)
        return nil, false, false
 }
 
+func (templateFinder) LookupVariants(name string) []tpl.Template {
+       return nil
+}
+
 func (templateFinder) LookupLayout(d output.LayoutDescriptor, f output.Format) (tpl.Template, bool, error) {
        return nil, false, nil
 }
index 315004b6a711cf3b526a2ef6ac2c2076e1a9f7c4..82d8775459d0e9ba225daab8ae7c24e84752d7b4 100644 (file)
@@ -68,6 +68,7 @@ type TemplateLookupVariant interface {
        // We are currently only interested in output formats, so we should improve
        // this for speed.
        LookupVariant(name string, variants TemplateVariants) (Template, bool, bool)
+       LookupVariants(name string) []Template
 }
 
 // Template is the common interface between text/template and html/template.
index 1243e6a15bd6eb03a7abec00854d800cc2b3d0dc..6171d167be247280a84d7763c91caae7db30f271 100644 (file)
@@ -354,6 +354,23 @@ func (t *templateHandler) LookupVariant(name string, variants tpl.TemplateVarian
 
 }
 
+// LookupVariants returns all variants of name, nil if none found.
+func (t *templateHandler) LookupVariants(name string) []tpl.Template {
+       name = templateBaseName(templateShortcode, name)
+       s, found := t.shortcodes[name]
+       if !found {
+               return nil
+       }
+
+       variants := make([]tpl.Template, len(s.variants))
+       for i := 0; i < len(variants); i++ {
+               variants[i] = s.variants[i].ts
+       }
+
+       return variants
+
+}
+
 func (t *templateHandler) HasTemplate(name string) bool {
 
        if _, found := t.baseof[name]; found {
@@ -966,6 +983,10 @@ func (t *textTemplateWrapperWithLock) LookupVariant(name string, variants tpl.Te
        panic("not supported")
 }
 
+func (t *textTemplateWrapperWithLock) LookupVariants(name string) []tpl.Template {
+       panic("not supported")
+}
+
 func (t *textTemplateWrapperWithLock) Parse(name, tpl string) (tpl.Template, error) {
        t.Lock()
        defer t.Unlock()