From f2795d4d2cef30170af43327f3ff7114923833b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sat, 13 Apr 2019 11:40:51 +0200 Subject: [PATCH] Fix WeightedPages in union etc. We introduced a callback func() to get the owner Page in 0.55.0. Sadly, funcs is not comparable type in Go. This commit replaces the func with a struct pointer that wraps the Page. Fixes #5850 --- hugolib/collections_test.go | 31 +++++++++++++++++++++++++++++++ hugolib/site.go | 2 +- hugolib/taxonomy.go | 10 +++------- resources/page/weighted.go | 17 +++++++++++------ 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/hugolib/collections_test.go b/hugolib/collections_test.go index bc55bdbe8..b7e89eec9 100644 --- a/hugolib/collections_test.go +++ b/hugolib/collections_test.go @@ -87,6 +87,37 @@ tags_weight: %d `weightedPages:2::page.WeightedPages:[WeightedPage(10,"Page") WeightedPage(20,"Page")]`) } +func TestUnionFunc(t *testing.T) { + assert := require.New(t) + + pageContent := ` +--- +title: "Page" +tags: ["blue", "green"] +tags_weight: %d +--- + +` + b := newTestSitesBuilder(t) + b.WithSimpleConfigFile(). + WithContent("page1.md", fmt.Sprintf(pageContent, 10), "page2.md", fmt.Sprintf(pageContent, 20), + "page3.md", fmt.Sprintf(pageContent, 30)). + WithTemplatesAdded("index.html", ` +{{ $unionPages := first 2 .Site.RegularPages | union .Site.RegularPages }} +{{ $unionWeightedPages := .Site.Taxonomies.tags.blue | union .Site.Taxonomies.tags.green }} +{{ printf "unionPages: %T %d" $unionPages (len $unionPages) }} +{{ printf "unionWeightedPages: %T %d" $unionWeightedPages (len $unionWeightedPages) }} +`) + b.CreateSites().Build(BuildCfg{}) + + assert.Equal(1, len(b.H.Sites)) + require.Len(t, b.H.Sites[0].RegularPages(), 3) + + b.AssertFileContent("public/index.html", + "unionPages: page.Pages 3", + "unionWeightedPages: page.WeightedPages 6") +} + func TestAppendFunc(t *testing.T) { assert := require.New(t) diff --git a/hugolib/site.go b/hugolib/site.go index 616b5b37d..2653479ea 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -1584,7 +1584,7 @@ func (s *Site) assembleTaxonomies() error { // last one will win, e.g. "hugo" vs "Hugo". n.term = term - w := page.NewWeightedPage(weight, p, n.getOwner) + w := page.NewWeightedPage(weight, p, n.owner) s.Taxonomies[plural].add(key, w) diff --git a/hugolib/taxonomy.go b/hugolib/taxonomy.go index 9d9e4f9ec..b91318ff1 100644 --- a/hugolib/taxonomy.go +++ b/hugolib/taxonomy.go @@ -175,7 +175,7 @@ type taxonomyNodeInfo struct { parent *taxonomyNodeInfo // Either of Kind taxonomyTerm (parent) or taxonomy - owner page.Page + owner *page.PageWrapper } func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) { @@ -185,17 +185,12 @@ func (t *taxonomyNodeInfo) UpdateFromPage(p page.Page) { } func (t *taxonomyNodeInfo) TransferValues(p *pageState) { - t.owner = p + t.owner.Page = p if p.Lastmod().IsZero() && p.Date().IsZero() { p.m.Dates.UpdateDateAndLastmodIfAfter(t.dates) } } -// callback sent to the child nodes. -func (t *taxonomyNodeInfo) getOwner() page.Page { - return t.owner -} - // Maps either plural or plural/term to a taxonomy node. // TODO(bep) consolidate somehow with s.Taxonomies type taxonomyNodeInfos map[string]*taxonomyNodeInfo @@ -216,6 +211,7 @@ func (t taxonomyNodeInfos) GetOrCreate(plural, termKey, term string) *taxonomyNo plural: plural, termKey: termKey, term: term, + owner: &page.PageWrapper{}, // Page will be assigned later. } t[key] = n diff --git a/resources/page/weighted.go b/resources/page/weighted.go index 0937b3f86..3f75bcc3c 100644 --- a/resources/page/weighted.go +++ b/resources/page/weighted.go @@ -38,11 +38,11 @@ func (p WeightedPages) Page() Page { first := p[0] // TODO(bep) fix tests - if first.getOwner == nil { + if first.owner == nil { return nil } - return first.getOwner() + return first.owner.Page } // A WeightedPage is a Page with a weight. @@ -50,15 +50,20 @@ type WeightedPage struct { Weight int Page - // A callback used to fetch the owning Page. This avoids having to do + // Reference to the owning Page. This avoids having to do // manual .Site.GetPage lookups. It is implemented in this roundabout way // because we cannot add additional state to the WeightedPages slice // without breaking lots of templates in the wild. - getOwner func() Page + owner *PageWrapper } -func NewWeightedPage(weight int, p Page, getOwner func() Page) WeightedPage { - return WeightedPage{Weight: weight, Page: p, getOwner: getOwner} +// PageWrapper wraps a Page. +type PageWrapper struct { + Page +} + +func NewWeightedPage(weight int, p Page, owner *PageWrapper) WeightedPage { + return WeightedPage{Weight: weight, Page: p, owner: owner} } func (w WeightedPage) String() string {