shithub: hugo

Download patch

ref: 1746e8a9b2be46dcd6cecbb4bc90983a9c69b333
parent: 6f48146e75e9877c4271ec239b763e6f3bc3babb
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Fri Feb 28 09:22:05 EST 2020

Fix ref/relRef regression for relative refs from bundles

Fixes #6952

--- a/hugolib/pagecollections.go
+++ b/hugolib/pagecollections.go
@@ -20,7 +20,7 @@
 	"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) 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 @@
 		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)
 	}
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -777,7 +777,6 @@
 }
 
 func (s *siteRefLinker) refLink(ref string, source interface{}, relative bool, outputFormat string) (string, error) {
-
 	p, err := unwrapPage(source)
 	if err != nil {
 		return "", err
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -940,6 +940,8 @@
 		{filepath.FromSlash("level2/level3/common.png"), ""},
 
 		{filepath.FromSlash("level2/level3/embedded.dot.md"), ""},
+
+		{filepath.FromSlash("leafbundle/index.md"), ""},
 	}
 
 	cfg, fs := newTestCfg()
@@ -1025,4 +1027,19 @@
 	if out, err := site.refLink(link, currentPage, relative, outputFormat); err != nil || out != expected {
 		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: <p>Ref: http://example.com/post/b2/</p>`)
 }
--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -443,7 +443,8 @@
 	// 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