summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-04-02 11:53:43 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-04-02 14:32:05 +0200
commit983b8d537c6af7b9790dc8ab31817f066309d5bd (patch)
treeb6556165e1f10df41267df947d49e2b18e50df77
parent6738a3e79dd545603d9851832bc3140fd184bfef (diff)
Fix resource bundling for overlapping page.md vs page.txt
Fixes #12320
-rw-r--r--hugolib/content_map_page.go9
-rw-r--r--hugolib/pagebundler_test.go39
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
+}