From: Bjørn Erik Pedersen Date: Sun, 28 Dec 2025 12:18:15 +0000 (+0100) Subject: Set cascade target to the content matrix if not set in the cascade itself X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=96777d9b8939a2cc6a511cbdcf64d4f899e98f66;p=brevno-suite%2Fhugo Set cascade target to the content matrix if not set in the cascade itself Fixes #14310 Co-authored-by: Joe Mooring --- diff --git a/hugolib/cascade_test.go b/hugolib/cascade_test.go index fa8e5e434..0df3af64c 100644 --- a/hugolib/cascade_test.go +++ b/hugolib/cascade_test.go @@ -365,3 +365,48 @@ Resource: {{ .Name }}|p1: {{ .Params.p1 }}| b.AssertFileContent("public/b1/index.html", "Title: b1|p1: v1|", "Resource: p2.md|p1: v1|") } + +// Issue 14310 +func TestCascadeIssue14310(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['home','rss','sitemap','taxonomy','term'] +defaultContentLanguage = 'en' +defaultContentLanguageInSubdir = true +[languages.en] +weight = 1 +[languages.de] +weight = 2 +-- layouts/all.html -- +{{ .Params.color }} +-- content/s1/_index.de.md -- +--- +title: s1 (de) +cascade: + params: + color: red (de) +--- +-- content/s1/_index.en.md -- +--- +title: s1 (en) +cascade: + params: + color: red (en) +--- +-- content/s1/p1.de.md -- +--- +title: p1 (de) +--- +-- content/s1/p1.en.md -- +--- +title: p1 (en) +--- +` + + b := Test(t, files) + + b.AssertFileContent("public/en/s1/p1/index.html", "red (en)") + b.AssertFileContent("public/de/s1/p1/index.html", "red (de)") // fails: file contains "red (en)" +} diff --git a/hugolib/hugo_smoke_test.go b/hugolib/hugo_smoke_test.go index 524249856..bf6d25949 100644 --- a/hugolib/hugo_smoke_test.go +++ b/hugolib/hugo_smoke_test.go @@ -544,7 +544,7 @@ Content Tag 1. b.AssertFileContent("public/en/posts/p1/index.html", "Single: en|page|/en/posts/p1/|Post 1|

Content 1.

\n|Len Resources: 2|", - "Resources: text|/en/posts/p1/f1.txt|text/plain|map[icon:enicon] - page||application/octet-stream|map[background:post.jpg draft:false iscjklanguage:false title:Post Sub 1] -", + "Resources: text|/en/posts/p1/f1.txt|text/plain|map[icon:enicon] - page||application/octet-stream|map[draft:false iscjklanguage:false title:Post Sub 1] -", "Icon: enicon", "Icon fingerprinted: enicon|/en/posts/p1/f1.e5746577af5cbfc4f34c558051b7955a9a5a795a84f1c6ab0609cb3473a924cb.txt|", "NextInSection: |\nPrevInSection: /en/posts/p2/|Post 2|", diff --git a/resources/page/page_matcher.go b/resources/page/page_matcher.go index 60f0c4654..163a91e90 100644 --- a/resources/page/page_matcher.go +++ b/resources/page/page_matcher.go @@ -246,8 +246,8 @@ func (d cascadeConfigDecoder) decodePageMatcher(m any, v *PageMatcher) error { } // DecodeCascadeConfigOptions -func (v *PageMatcher) compileSitesMatrix(configuredDimensions *sitesmatrix.ConfiguredDimensions) error { - if v.Sites.Matrix.IsZero() { +func (v *PageMatcher) compileSitesMatrix(defaults sitesmatrix.VectorStore, configuredDimensions *sitesmatrix.ConfiguredDimensions) error { + if v.Sites.Matrix.IsZero() && defaults == nil { // Nothing to do. v.SitesMatrixCompiled = nil return nil @@ -255,8 +255,12 @@ func (v *PageMatcher) compileSitesMatrix(configuredDimensions *sitesmatrix.Confi intSetsCfg := sitesmatrix.IntSetsConfig{ Globs: v.Sites.Matrix, } - b := sitesmatrix.NewIntSetsBuilder(configuredDimensions).WithConfig(intSetsCfg).WithAllIfNotSet() + b := sitesmatrix.NewIntSetsBuilder(configuredDimensions).WithConfig(intSetsCfg) + if defaults != nil && v.Sites.Matrix.IsZero() { + b = b.WithDimensionsFromOtherIfNotSet(defaults) + } + b = b.WithAllIfNotSet() v.SitesMatrixCompiled = b.Build() return nil } @@ -281,6 +285,17 @@ func (p *PageMatcherParamsConfig) init() error { return nil } +func (p *PageMatcherParamsConfig) hasSitesMatrix() bool { + if m, ok := p.Fields["sites"]; ok { + mm := maps.ToStringMap(m) + if sm, found := mm["matrix"]; found { + mmm := maps.ToStringMap(sm) + return len(mmm) > 0 + } + } + return false +} + type PageMatcherParamsConfigs struct { c []*config.ConfigNamespace[[]PageMatcherParamsConfig, CascadeConfig] } @@ -347,16 +362,23 @@ func (c *PageMatcherParamsConfigs) SourceHash() uint64 { return h.Sum64() } -func (c *PageMatcherParamsConfigs) InitConfig(logger loggers.Logger, _ sitesmatrix.VectorStore, configuredDimensions *sitesmatrix.ConfiguredDimensions) error { +func (c *PageMatcherParamsConfigs) InitConfig(logger loggers.Logger, defaultsIn sitesmatrix.VectorStore, configuredDimensions *sitesmatrix.ConfiguredDimensions) error { if c == nil { return nil } for _, cc := range c.c { for i := range cc.Config.Cascades { - checkCascadePattern(logger, cc.Config.Cascades[i].Target) - if err := cc.Config.Cascades[i].Target.compileSitesMatrix(configuredDimensions); err != nil { + ccc := cc.Config.Cascades[i] + checkCascadePattern(logger, ccc.Target) + defaults := defaultsIn + hasSitesMatrix := ccc.hasSitesMatrix() + if hasSitesMatrix { + defaults = nil + } + if err := ccc.Target.compileSitesMatrix(defaults, configuredDimensions); err != nil { return fmt.Errorf("failed to compile cascade target %d: %w", i, err) } + cc.Config.Cascades[i] = ccc } } return nil