From f1d755965fba9a8d99a4e423c6e231cf7411b4a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 15 Mar 2024 18:07:28 +0100 Subject: [PATCH] Fix .Parent when there are overlapping regular pages inbetween Fixes #12263 --- hugolib/page__tree.go | 13 +++++++++---- hugolib/site_sections_test.go | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/hugolib/page__tree.go b/hugolib/page__tree.go index e54d596bc..cccfb8904 100644 --- a/hugolib/page__tree.go +++ b/hugolib/page__tree.go @@ -124,11 +124,16 @@ func (pt pageTree) Parent() page.Page { return pt.p.s.home } - _, n := pt.p.s.pageMap.treePages.LongestPrefix(dir, true, nil) - if n != nil { - return n.(page.Page) + for { + _, n := pt.p.s.pageMap.treePages.LongestPrefix(dir, true, nil) + if n == nil { + return pt.p.s.home + } + if pt.p.m.bundled || n.isContentNodeBranch() { + return n.(page.Page) + } + dir = paths.Dir(dir) } - return nil } func (pt pageTree) Ancestors() page.Pages { diff --git a/hugolib/site_sections_test.go b/hugolib/site_sections_test.go index 4d4ff965b..7fa15fb66 100644 --- a/hugolib/site_sections_test.go +++ b/hugolib/site_sections_test.go @@ -398,3 +398,26 @@ Kind: {{ .Kind }}|RelPermalink: {{ .RelPermalink }}|SectionsPath: {{ .SectionsPa b.AssertFileContent("public/a/b/c/mybundle/index.html", "Kind: page|RelPermalink: /a/b/c/mybundle/|SectionsPath: /a/b/c|SectionsEntries: [a b c]|Len: 3") b.AssertFileContent("public/index.html", "Kind: home|RelPermalink: /|SectionsPath: /|SectionsEntries: []|Len: 0") } + +func TestParentWithPageOverlap(t *testing.T) { + files := ` +-- hugo.toml -- +baseURL = "https://example.com/" +-- content/docs/_index.md -- +-- content/docs/logs/_index.md -- +-- content/docs/logs/sdk.md -- +-- content/docs/logs/sdk_exporters/stdout.md -- +-- layouts/_default/list.html -- +{{ .RelPermalink }}|{{ with .Parent}}{{ .RelPermalink }}{{ end }}| +-- layouts/_default/single.html -- +{{ .RelPermalink }}|{{ with .Parent}}{{ .RelPermalink }}{{ end }}| + +` + b := Test(t, files) + + b.AssertFileContent("public/index.html", "/||") + b.AssertFileContent("public/docs/index.html", "/docs/|/|") + b.AssertFileContent("public/docs/logs/index.html", "/docs/logs/|/docs/|") + b.AssertFileContent("public/docs/logs/sdk/index.html", "/docs/logs/sdk/|/docs/logs/|") + b.AssertFileContent("public/docs/logs/sdk_exporters/stdout/index.html", "/docs/logs/sdk_exporters/stdout/|/docs/logs/|") +}