Skip to content

Commit 96777d9

Browse files
bepjmooring
andcommitted
Set cascade target to the content matrix if not set in the cascade itself
Fixes #14310 Co-authored-by: Joe Mooring <joe.mooring@veriphor.com>
1 parent 25126e5 commit 96777d9

File tree

3 files changed

+74
-7
lines changed

3 files changed

+74
-7
lines changed

‎hugolib/cascade_test.go‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,48 @@ Resource: {{ .Name }}|p1: {{ .Params.p1 }}|
365365

366366
b.AssertFileContent("public/b1/index.html", "Title: b1|p1: v1|", "Resource: p2.md|p1: v1|")
367367
}
368+
369+
// Issue 14310
370+
func TestCascadeIssue14310(t *testing.T) {
371+
t.Parallel()
372+
373+
files := `
374+
-- hugo.toml --
375+
disableKinds = ['home','rss','sitemap','taxonomy','term']
376+
defaultContentLanguage = 'en'
377+
defaultContentLanguageInSubdir = true
378+
[languages.en]
379+
weight = 1
380+
[languages.de]
381+
weight = 2
382+
-- layouts/all.html --
383+
{{ .Params.color }}
384+
-- content/s1/_index.de.md --
385+
---
386+
title: s1 (de)
387+
cascade:
388+
params:
389+
color: red (de)
390+
---
391+
-- content/s1/_index.en.md --
392+
---
393+
title: s1 (en)
394+
cascade:
395+
params:
396+
color: red (en)
397+
---
398+
-- content/s1/p1.de.md --
399+
---
400+
title: p1 (de)
401+
---
402+
-- content/s1/p1.en.md --
403+
---
404+
title: p1 (en)
405+
---
406+
`
407+
408+
b := Test(t, files)
409+
410+
b.AssertFileContent("public/en/s1/p1/index.html", "red (en)")
411+
b.AssertFileContent("public/de/s1/p1/index.html", "red (de)") // fails: file contains "red (en)"
412+
}

‎hugolib/hugo_smoke_test.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ Content Tag 1.
544544

545545
b.AssertFileContent("public/en/posts/p1/index.html",
546546
"Single: en|page|/en/posts/p1/|Post 1|<p>Content 1.</p>\n|Len Resources: 2|",
547-
"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] -",
547+
"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] -",
548548
"Icon: enicon",
549549
"Icon fingerprinted: enicon|/en/posts/p1/f1.e5746577af5cbfc4f34c558051b7955a9a5a795a84f1c6ab0609cb3473a924cb.txt|",
550550
"NextInSection: |\nPrevInSection: /en/posts/p2/|Post 2|",

‎resources/page/page_matcher.go‎

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -246,17 +246,21 @@ func (d cascadeConfigDecoder) decodePageMatcher(m any, v *PageMatcher) error {
246246
}
247247

248248
// DecodeCascadeConfigOptions
249-
func (v *PageMatcher) compileSitesMatrix(configuredDimensions *sitesmatrix.ConfiguredDimensions) error {
250-
if v.Sites.Matrix.IsZero() {
249+
func (v *PageMatcher) compileSitesMatrix(defaults sitesmatrix.VectorStore, configuredDimensions *sitesmatrix.ConfiguredDimensions) error {
250+
if v.Sites.Matrix.IsZero() && defaults == nil {
251251
// Nothing to do.
252252
v.SitesMatrixCompiled = nil
253253
return nil
254254
}
255255
intSetsCfg := sitesmatrix.IntSetsConfig{
256256
Globs: v.Sites.Matrix,
257257
}
258-
b := sitesmatrix.NewIntSetsBuilder(configuredDimensions).WithConfig(intSetsCfg).WithAllIfNotSet()
259258

259+
b := sitesmatrix.NewIntSetsBuilder(configuredDimensions).WithConfig(intSetsCfg)
260+
if defaults != nil && v.Sites.Matrix.IsZero() {
261+
b = b.WithDimensionsFromOtherIfNotSet(defaults)
262+
}
263+
b = b.WithAllIfNotSet()
260264
v.SitesMatrixCompiled = b.Build()
261265
return nil
262266
}
@@ -281,6 +285,17 @@ func (p *PageMatcherParamsConfig) init() error {
281285
return nil
282286
}
283287

288+
func (p *PageMatcherParamsConfig) hasSitesMatrix() bool {
289+
if m, ok := p.Fields["sites"]; ok {
290+
mm := maps.ToStringMap(m)
291+
if sm, found := mm["matrix"]; found {
292+
mmm := maps.ToStringMap(sm)
293+
return len(mmm) > 0
294+
}
295+
}
296+
return false
297+
}
298+
284299
type PageMatcherParamsConfigs struct {
285300
c []*config.ConfigNamespace[[]PageMatcherParamsConfig, CascadeConfig]
286301
}
@@ -347,16 +362,23 @@ func (c *PageMatcherParamsConfigs) SourceHash() uint64 {
347362
return h.Sum64()
348363
}
349364

350-
func (c *PageMatcherParamsConfigs) InitConfig(logger loggers.Logger, _ sitesmatrix.VectorStore, configuredDimensions *sitesmatrix.ConfiguredDimensions) error {
365+
func (c *PageMatcherParamsConfigs) InitConfig(logger loggers.Logger, defaultsIn sitesmatrix.VectorStore, configuredDimensions *sitesmatrix.ConfiguredDimensions) error {
351366
if c == nil {
352367
return nil
353368
}
354369
for _, cc := range c.c {
355370
for i := range cc.Config.Cascades {
356-
checkCascadePattern(logger, cc.Config.Cascades[i].Target)
357-
if err := cc.Config.Cascades[i].Target.compileSitesMatrix(configuredDimensions); err != nil {
371+
ccc := cc.Config.Cascades[i]
372+
checkCascadePattern(logger, ccc.Target)
373+
defaults := defaultsIn
374+
hasSitesMatrix := ccc.hasSitesMatrix()
375+
if hasSitesMatrix {
376+
defaults = nil
377+
}
378+
if err := ccc.Target.compileSitesMatrix(defaults, configuredDimensions); err != nil {
358379
return fmt.Errorf("failed to compile cascade target %d: %w", i, err)
359380
}
381+
cc.Config.Cascades[i] = ccc
360382
}
361383
}
362384
return nil

0 commit comments

Comments
 (0)