gohugoio / hugo

The world’s fastest framework for building websites.
https://gohugo.io
Apache License 2.0
75.73k stars 7.53k forks source link

Cascade property affects the next page with similar name #12465

Open tobias-sundermann opened 6 months ago

tobias-sundermann commented 6 months ago

What version of Hugo are you using (hugo version)?

$ hugo v0.122.0-b9a03bd59d5f71a529acb3e33f995e0ef332b3aa+extended windows/amd64

Tested versions: Hugo extended windows-amd64 versions 0.123.0 - 0.125.6

Does this issue reproduce with the latest release?

Yes

Bug description

Cascade property affects the next page with similar name. We use cascade in one of our pages (/team) to prevent rendering its children separately. But the cascade property affects the next following page (/teams).

File setup

/content ├ /de │├ /... │├ /team (List of our employees) ││├ /employee_1 │││└ index.md ││├ /... ││└ _index.md │├ /teams (Articles about Microsoft Teams) ││├ /article_1 │││└ index.md ││├ /... ││└ _index.md │├ /... ...

Code

/content/de/team/_index.md:

...
cascade:
    _build:
        render: never
_build:
    render: always
---

Tests

  1. Renaming the folder "/teams" to "/xteams" → "/xteams" was rendered
  2. Put the same cascade properties pages where the next page had an similar name → E.g. cascade properties were added to "/microsoft" and the next page ("microsoft-365") wasn't rendered anymore

Conclusion

Cascade should only affect children of an page. → /page/... But cascade affect every page where the name starts with the name of the page with the cascade properties. → /page...

jmooring commented 6 months ago

This problem was introduced in v0.123.0. Failing test:

func TestFoo(t *testing.T) {
    t.Parallel()

    files := `
-- hugo.toml --
disableKinds = ['home','rss','sitemap','taxonomy','term']
-- layouts/_default/list.html --
{{ .Title }}
-- layouts/_default/single.html --
{{ .Title }}
-- content/s/_index.md --
---
title: s
cascade:
  _build:
    render: never
---
-- content/s/p1.md --
---
title: p1
---
-- content/sx/_index.md --
---
title: sx
---
-- content/sx/p2.md --
---
title: p2
---
`

    b := hugolib.Test(t, files)

    b.AssertFileExists("public/s/index.html", false)
    b.AssertFileExists("public/s/p1/index.html", false)

    b.AssertFileExists("public/sx/index.html", true)    // failing
    b.AssertFileExists("public/sx/p2/index.html", true) // failing
}
jmooring commented 6 months ago

@tobias-sundermann

You can work around this by removing the cascade from matter, and specify the cascade in your site configuration instead:

[[cascade]]
[cascade.build]
render = 'never'
[cascade._target]
path = '{/s,/s/**}'

This will suppress rendering of all pages in the given section, including the section page itself.