summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-02-28 14:22:05 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-02-29 18:32:06 +0100
commit1746e8a9b2be46dcd6cecbb4bc90983a9c69b333 (patch)
tree45a8cbb965f9070473e2a4d7a6330fd8fdf77b24
parent6f48146e75e9877c4271ec239b763e6f3bc3babb (diff)
Fix ref/relRef regression for relative refs from bundles
Fixes #6952
-rw-r--r--hugolib/pagecollections.go16
-rw-r--r--hugolib/site.go1
-rw-r--r--hugolib/site_test.go17
-rw-r--r--hugolib/testhelpers_test.go3
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: <p>Ref: http://example.com/post/b2/</p>`)
+}
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