summaryrefslogtreecommitdiffstats
path: root/hugolib
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-09-07 15:07:10 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-09-07 21:06:44 +0200
commit4055c121847847d8bd6b95a928185daee065091b (patch)
tree6620f51e7e89aa7ff0a9a93361d640ee5b297fea /hugolib
parent3ba7c92530a80f2f04fe57705ab05c247a6e8437 (diff)
Fix some change detection issues on server reloads
* Fix change detection when .GetPage/site.GetPage is used from shortcode * Fix stale content for GetPage results with short name lookups on server reloads Fixes #7623 Fixes #7624 Fixes #7625
Diffstat (limited to 'hugolib')
-rw-r--r--hugolib/content_map.go41
-rw-r--r--hugolib/hugo_sites.go1
-rw-r--r--hugolib/hugo_sites_rebuild_test.go63
-rw-r--r--hugolib/page.go17
-rw-r--r--hugolib/site.go13
-rw-r--r--hugolib/template_test.go2
6 files changed, 120 insertions, 17 deletions
diff --git a/hugolib/content_map.go b/hugolib/content_map.go
index 43ad7745d..33ef4f8dd 100644
--- a/hugolib/content_map.go
+++ b/hugolib/content_map.go
@@ -95,21 +95,23 @@ func newContentMap(cfg contentMapConfig) *contentMap {
m.pageReverseIndex = &contentTreeReverseIndex{
t: []*contentTree{m.pages, m.sections, m.taxonomies},
- initFn: func(t *contentTree, m map[interface{}]*contentNode) {
- t.Walk(func(s string, v interface{}) bool {
- n := v.(*contentNode)
- if n.p != nil && !n.p.File().IsZero() {
- meta := n.p.File().FileInfo().Meta()
- if meta.Path() != meta.PathFile() {
- // Keep track of the original mount source.
- mountKey := filepath.ToSlash(filepath.Join(meta.Module(), meta.PathFile()))
- addToReverseMap(mountKey, n, m)
+ contentTreeReverseIndexMap: &contentTreeReverseIndexMap{
+ initFn: func(t *contentTree, m map[interface{}]*contentNode) {
+ t.Walk(func(s string, v interface{}) bool {
+ n := v.(*contentNode)
+ if n.p != nil && !n.p.File().IsZero() {
+ meta := n.p.File().FileInfo().Meta()
+ if meta.Path() != meta.PathFile() {
+ // Keep track of the original mount source.
+ mountKey := filepath.ToSlash(filepath.Join(meta.Module(), meta.PathFile()))
+ addToReverseMap(mountKey, n, m)
+ }
}
- }
- k := strings.TrimPrefix(strings.TrimSuffix(path.Base(s), cmLeafSeparator), cmBranchSeparator)
- addToReverseMap(k, n, m)
- return false
- })
+ k := strings.TrimPrefix(strings.TrimSuffix(path.Base(s), cmLeafSeparator), cmBranchSeparator)
+ addToReverseMap(k, n, m)
+ return false
+ })
+ },
},
}
@@ -1030,12 +1032,21 @@ func (c *contentTreeRef) getSections() page.Pages {
type contentTreeReverseIndex struct {
t []*contentTree
- m map[interface{}]*contentNode
+ *contentTreeReverseIndexMap
+}
+type contentTreeReverseIndexMap struct {
+ m map[interface{}]*contentNode
init sync.Once
initFn func(*contentTree, map[interface{}]*contentNode)
}
+func (c *contentTreeReverseIndex) Reset() {
+ c.contentTreeReverseIndexMap = &contentTreeReverseIndexMap{
+ initFn: c.initFn,
+ }
+}
+
func (c *contentTreeReverseIndex) Get(key interface{}) *contentNode {
c.init.Do(func() {
c.m = make(map[interface{}]*contentNode)
diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go
index d1e3a146d..702e51abb 100644
--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -997,7 +997,6 @@ func (h *HugoSites) resetPageStateFromEvents(idset identity.Identities) {
}
return false
})
-
}
// Used in partial reloading to determine if the change is in a bundle.
diff --git a/hugolib/hugo_sites_rebuild_test.go b/hugolib/hugo_sites_rebuild_test.go
index f0c9f8f09..4c4741385 100644
--- a/hugolib/hugo_sites_rebuild_test.go
+++ b/hugolib/hugo_sites_rebuild_test.go
@@ -259,3 +259,66 @@ Output Shortcode AMP Edited
})
}
+
+// Issues #7623 #7625
+func TestSitesRebuildOnFilesIncludedWithGetPage(t *testing.T) {
+ b := newTestSitesBuilder(t).Running()
+ b.WithContent("pages/p1.md", `---
+title: p1
+---
+P3: {{< GetPage "pages/p3" >}}
+`)
+
+ b.WithContent("pages/p2.md", `---
+title: p2
+---
+P4: {{< site_GetPage "pages/p4" >}}
+P5: {{< site_GetPage "p5" >}}
+P6: {{< dot_site_GetPage "p6" >}}
+`)
+
+ b.WithContent("pages/p3/index.md", "---\ntitle: p3\nheadless: true\n---\nP3 content")
+ b.WithContent("pages/p4/index.md", "---\ntitle: p4\nheadless: true\n---\nP4 content")
+ b.WithContent("pages/p5.md", "---\ntitle: p5\n---\nP5 content")
+ b.WithContent("pages/p6.md", "---\ntitle: p6\n---\nP6 content")
+
+ b.WithTemplates(
+ "_default/single.html", `{{ .Content }}`,
+ "shortcodes/GetPage.html", `
+{{ $arg := .Get 0 }}
+{{ $p := .Page.GetPage $arg }}
+{{ $p.Content }}
+ `,
+ "shortcodes/site_GetPage.html", `
+{{ $arg := .Get 0 }}
+{{ $p := site.GetPage $arg }}
+{{ $p.Content }}
+ `, "shortcodes/dot_site_GetPage.html", `
+{{ $arg := .Get 0 }}
+{{ $p := .Site.GetPage $arg }}
+{{ $p.Content }}
+ `,
+ )
+
+ b.Build(BuildCfg{})
+
+ b.AssertFileContent("public/pages/p1/index.html", "P3 content")
+ b.AssertFileContent("public/pages/p2/index.html", `P4 content
+P5 content
+P6 content
+`)
+
+ b.EditFiles("content/pages/p3/index.md", "---\ntitle: p3\n---\nP3 changed content")
+ b.EditFiles("content/pages/p4/index.md", "---\ntitle: p4\n---\nP4 changed content")
+ b.EditFiles("content/pages/p5.md", "---\ntitle: p5\n---\nP5 changed content")
+ b.EditFiles("content/pages/p6.md", "---\ntitle: p6\n---\nP6 changed content")
+
+ b.Build(BuildCfg{})
+
+ b.AssertFileContent("public/pages/p1/index.html", "P3 changed content")
+ b.AssertFileContent("public/pages/p2/index.html", `P4 changed content
+P5 changed content
+P6 changed content
+`)
+
+}
diff --git a/hugolib/page.go b/hugolib/page.go
index 28ef1e156..ca93bf18b 100644
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -78,6 +78,7 @@ type pageContext interface {
posOffset(offset int) text.Position
wrapError(err error) error
getContentConverter() converter.Converter
+ addDependency(dep identity.Provider)
}
// wrapErr adds some context to the given error if possible.
@@ -93,6 +94,18 @@ type pageSiteAdapter struct {
s *Site
}
+func (pa pageSiteAdapter) GetPageWithTemplateInfo(info tpl.Info, ref string) (page.Page, error) {
+ p, err := pa.GetPage(ref)
+ if p != nil {
+ // Track pages referenced by templates/shortcodes
+ // when in server mode.
+ if im, ok := info.(identity.Manager); ok {
+ im.Add(p)
+ }
+ }
+ return p, err
+}
+
func (pa pageSiteAdapter) GetPage(ref string) (page.Page, error) {
p, err := pa.s.getPageNew(pa.p, ref)
if p == nil {
@@ -127,6 +140,10 @@ func (p *pageState) Eq(other interface{}) bool {
return p == pp
}
+func (p *pageState) GetIdentity() identity.Identity {
+ return identity.NewPathIdentity(files.ComponentFolderContent, filepath.FromSlash(p.Path()))
+}
+
func (p *pageState) GitInfo() *gitmap.GitInfo {
return p.gitInfo
}
diff --git a/hugolib/site.go b/hugolib/site.go
index ac65931d0..dad5ab538 100644
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -1538,6 +1538,7 @@ func (s *Site) resetBuildState(sourceChanged bool) {
s.init.Reset()
if sourceChanged {
+ s.pageMap.contentMap.pageReverseIndex.Reset()
s.PageCollections = newPageCollections(s.pageMap)
s.pageMap.withEveryBundlePage(func(p *pageState) bool {
p.pagePages = &pagePages{}
@@ -1587,6 +1588,18 @@ func (s *SiteInfo) GetPage(ref ...string) (page.Page, error) {
return p, err
}
+func (s *SiteInfo) GetPageWithTemplateInfo(info tpl.Info, ref ...string) (page.Page, error) {
+ p, err := s.GetPage(ref...)
+ if p != nil {
+ // Track pages referenced by templates/shortcodes
+ // when in server mode.
+ if im, ok := info.(identity.Manager); ok {
+ im.Add(p)
+ }
+ }
+ return p, err
+}
+
func (s *Site) permalink(link string) string {
return s.PathSpec.PermalinkForBaseURL(link, s.PathSpec.BaseURL.String())
}
diff --git a/hugolib/template_test.go b/hugolib/template_test.go
index 6f37b4164..39f1b9e2e 100644
--- a/hugolib/template_test.go
+++ b/hugolib/template_test.go
@@ -599,7 +599,7 @@ title: P1
idset := make(map[identity.Identity]bool)
collectIdentities(idset, templ.(tpl.Info))
- b.Assert(idset, qt.HasLen, 10)
+ b.Assert(idset, qt.HasLen, 11)
}