From 6142bc701cc3b0b0ac59287d22e81de552e1382b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 16 May 2025 09:26:17 +0200 Subject: [PATCH] tpl: Fix theme overrides when theme has old layout setup (e.g. _default) Fixes #13715 --- tpl/tplimpl/templatestore.go | 21 +++++++++++++------ tpl/tplimpl/templatestore_integration_test.go | 17 +++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/tpl/tplimpl/templatestore.go b/tpl/tplimpl/templatestore.go index 53880eb33..c6a6d4cd5 100644 --- a/tpl/tplimpl/templatestore.go +++ b/tpl/tplimpl/templatestore.go @@ -1133,12 +1133,21 @@ func (s *TemplateStore) insertTemplate2( tree.Insert(key, m) } - if !replace { - if v, found := m[nk]; found { - if len(pi.Identifiers()) >= len(v.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 - } + 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 } } diff --git a/tpl/tplimpl/templatestore_integration_test.go b/tpl/tplimpl/templatestore_integration_test.go index 75ec0376f..e10d7149a 100644 --- a/tpl/tplimpl/templatestore_integration_test.go +++ b/tpl/tplimpl/templatestore_integration_test.go @@ -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 --