From 983b8d537c6af7b9790dc8ab31817f066309d5bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 2 Apr 2024 11:53:43 +0200 Subject: [PATCH] Fix resource bundling for overlapping page.md vs page.txt Fixes #12320 --- hugolib/content_map_page.go | 9 +++++++-- hugolib/pagebundler_test.go | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go index 2f0a6408b..ff0b05ed1 100644 --- a/hugolib/content_map_page.go +++ b/hugolib/content_map_page.go @@ -489,12 +489,17 @@ func (m *pageMap) forEachResourceInPage( rw.Handle = func(resourceKey string, n contentNodeI, match doctree.DimensionFlag) (bool, error) { if isBranch { - ownerKey, _ := m.treePages.LongestPrefixAll(resourceKey) - if ownerKey != keyPage && path.Dir(ownerKey) != path.Dir(resourceKey) { + // A resourceKey always represents a filename with extension. + // A page key points to the logical path of a page, which when sourced from the filesystem + // may represent a directory (bundles) or a single content file (e.g. p1.md). + // So, to avoid any overlapping ambiguity, we start looking from the owning directory. + ownerKey, _ := m.treePages.LongestPrefixAll(path.Dir(resourceKey)) + if ownerKey != keyPage { // Stop walking downwards, someone else owns this resource. rw.SkipPrefix(ownerKey + "/") return false, nil } + } return handle(resourceKey, n, match) } diff --git a/hugolib/pagebundler_test.go b/hugolib/pagebundler_test.go index a46ef0b56..302201a1f 100644 --- a/hugolib/pagebundler_test.go +++ b/hugolib/pagebundler_test.go @@ -919,3 +919,42 @@ GetMatch: {{ with .Resources.GetMatch "f1.*" }}{{ .Name }}: {{ .Content }}|{{ en b.AssertFileContent("public/mybundle/index.html", "GetMatch: f1.en.txt: F1.|") } + +func TestBundleBranchIssue12320(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['rss','sitemap','taxonomy','term'] +defaultContentLanguage = 'en' +defaultContentLanguageInSubdir = true +[languages.en] +baseURL = "https://en.example.org/" +contentDir = "content/en" +[languages.fr] +baseURL = "https://fr.example.org/" +contentDir = "content/fr" +-- content/en/s1/p1.md -- +--- +title: p1 +--- +-- content/en/s1/p1.txt -- +--- +p1.txt +--- +-- layouts/_default/single.html -- +{{ .Title }}| +-- layouts/_default/list.html -- +{{ .Title }}| +` + + b := Test(t, files) + + b.AssertFileExists("public/en/s1/index.html", true) + b.AssertFileExists("public/en/s1/p1/index.html", true) + b.AssertFileExists("public/en/s1/p1.txt", true) + + b.AssertFileExists("public/fr/s1/index.html", false) + b.AssertFileExists("public/fr/s1/p1/index.html", false) + b.AssertFileExists("public/fr/s1/p1.txt", false) // failing test +}