tpl: Fix theme overrides when theme has old layout setup (e.g. _default)

Fixes #13715
This commit is contained in:
Bjørn Erik Pedersen
2025-05-16 09:26:17 +02:00
parent e6574cf7a7
commit 6142bc701c
2 changed files with 32 additions and 6 deletions

View File

@@ -1133,14 +1133,23 @@ func (s *TemplateStore) insertTemplate2(
tree.Insert(key, m)
}
if !replace {
if v, found := m[nk]; found {
if len(pi.Identifiers()) >= len(v.PathInfo.Identifiers()) {
nkExisting, existingFound := m[nk]
if !replace && existingFound && fi != nil && nkExisting.Fi != nil {
// See issue #13715.
// We do the merge on the file system level, but from Hugo v0.146.0 we have a situation where
// the project may well have a different layouts layout compared to the theme(s) it uses.
// We could possibly have fixed that on a lower (file system) level, but since this is just
// a temporary situation (until all projects are updated),
// do a replace here if the file comes from higher up in the module chain.
replace = fi.Meta().ModuleOrdinal < nkExisting.Fi.Meta().ModuleOrdinal
}
if !replace && existingFound {
if len(pi.Identifiers()) >= len(nkExisting.PathInfo.Identifiers()) {
// e.g. /pages/home.foo.html and /pages/home.html where foo may be a valid language name in another site.
return nil, nil
}
}
}
ti := &TemplInfo{
PathInfo: pi,

View File

@@ -1103,6 +1103,23 @@ All.
b.AssertLogContains("unrecognized render hook")
}
func TestLayoutOverrideThemeWhenThemeOnOldFormatIssue13715(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
theme = "mytheme"
-- layouts/list.html --
layouts/list.html
-- themes/mytheme/layouts/_default/list.html --
mytheme/layouts/_default/list.html
`
b := hugolib.Test(t, files)
b.AssertFileContent("public/index.html", "layouts/list.html")
}
func BenchmarkExecuteWithContext(b *testing.B) {
files := `
-- hugo.toml --