From 1746e8a9b2be46dcd6cecbb4bc90983a9c69b333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 28 Feb 2020 14:22:05 +0100 Subject: [PATCH] Fix ref/relRef regression for relative refs from bundles Fixes #6952 --- hugolib/pagecollections.go | 16 ++++++++++++---- hugolib/site.go | 1 - hugolib/site_test.go | 17 +++++++++++++++++ hugolib/testhelpers_test.go | 3 ++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/hugolib/pagecollections.go b/hugolib/pagecollections.go index 74d48fe22..7982b25ac 100644 --- a/hugolib/pagecollections.go +++ b/hugolib/pagecollections.go @@ -20,7 +20,7 @@ import ( "strings" "sync" - "github.com/gohugoio/hugo/common/herrors" + "github.com/gohugoio/hugo/hugofs/files" "github.com/gohugoio/hugo/helpers" @@ -207,13 +207,12 @@ func (c *PageCollections) getSectionOrPage(ref string) (*contentNode, string) { } func (c *PageCollections) getContentNode(context page.Page, isReflink bool, ref string) (*contentNode, error) { - defer herrors.Recover() ref = filepath.ToSlash(strings.ToLower(strings.TrimSpace(ref))) if ref == "" { ref = "/" } inRef := ref - + navUp := strings.HasPrefix(ref, "..") var doSimpleLookup bool if isReflink || context == nil { // For Ref/Reflink and .Site.GetPage do simple name lookups for the potentially ambigous myarticle.md and /myarticle.md, @@ -227,7 +226,16 @@ func (c *PageCollections) getContentNode(context page.Page, isReflink bool, ref if context.File().IsZero() { base = context.SectionsPath() } else { - base = filepath.ToSlash(filepath.Dir(context.File().FileInfo().Meta().Path())) + meta := context.File().FileInfo().Meta() + base = filepath.ToSlash(filepath.Dir(meta.Path())) + if meta.Classifier() == files.ContentClassLeaf { + // Bundles are stored in subfolders e.g. blog/mybundle/index.md, + // so if the user has not explicitly asked to go up, + // look on the "blog" level. + if !navUp { + base = path.Dir(base) + } + } } ref = path.Join("/", strings.ToLower(base), ref) } diff --git a/hugolib/site.go b/hugolib/site.go index ac67c1210..f85dc47e2 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -777,7 +777,6 @@ func (s siteRefLinker) logNotFound(ref, what string, p page.Page, position text. } func (s *siteRefLinker) refLink(ref string, source interface{}, relative bool, outputFormat string) (string, error) { - p, err := unwrapPage(source) if err != nil { return "", err diff --git a/hugolib/site_test.go b/hugolib/site_test.go index cd8c87c43..22b078f5a 100644 --- a/hugolib/site_test.go +++ b/hugolib/site_test.go @@ -940,6 +940,8 @@ func setupLinkingMockSite(t *testing.T) *Site { {filepath.FromSlash("level2/level3/common.png"), ""}, {filepath.FromSlash("level2/level3/embedded.dot.md"), ""}, + + {filepath.FromSlash("leafbundle/index.md"), ""}, } cfg, fs := newTestCfg() @@ -1026,3 +1028,18 @@ func checkLinkCase(site *Site, link string, currentPage page.Page, relative bool t.Fatalf("[%d] Expected %q from %q to resolve to %q, got %q - error: %s", i, link, currentPage.Path(), expected, out, err) } } + +// https://github.com/gohugoio/hugo/issues/6952 +func TestRefBundle(t *testing.T) { + b := newTestSitesBuilder(t) + b.WithContent( + "post/b1/index.md", "---\ntitle: pb1\n---\nRef: {{< ref \"b2\" >}}", + "post/b2/index.md", "---\ntitle: pb2\n---\n", + ) + b.WithTemplates("index.html", `Home`) + b.WithTemplates("_default/single.html", `Content: {{ .Content }}`) + + b.Build(BuildCfg{}) + + b.AssertFileContent("public/post/b1/index.html", `Content:

Ref: http://example.com/post/b2/

`) +} diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go index fe6f3b7e3..137dbd701 100644 --- a/hugolib/testhelpers_test.go +++ b/hugolib/testhelpers_test.go @@ -443,7 +443,8 @@ func (s *sitesBuilder) writeFilePairs(folder string, files []filenameContent) *s // our tests running with the in memory filesystem. // That file system is backed by a map so not sure how this helps, but some // randomness in tests doesn't hurt. - s.rnd.Shuffle(len(files), func(i, j int) { files[i], files[j] = files[j], files[i] }) + // TODO(bep) this turns out to be more confusing than helpful. + //s.rnd.Shuffle(len(files), func(i, j int) { files[i], files[j] = files[j], files[i] }) for _, fc := range files { target := folder