Fix ambigous error on site.GetPage

Fixes #7016
This commit is contained in:
Bjørn Erik Pedersen 2020-03-09 14:01:28 +01:00
parent ffcb4aeb8e
commit 6cceef65c2
2 changed files with 66 additions and 3 deletions

View file

@ -206,6 +206,22 @@ func (c *PageCollections) getSectionOrPage(ref string) (*contentNode, string) {
}
// For Ref/Reflink and .Site.GetPage do simple name lookups for the potentially ambigous myarticle.md and /myarticle.md,
// but not when we get ./myarticle*, section/myarticle.
func shouldDoSimpleLookup(ref string) bool {
if ref[0] == '.' {
return false
}
slashCount := strings.Count(ref, "/")
if slashCount > 1 {
return false
}
return slashCount == 0 || ref[0] == '/'
}
func (c *PageCollections) getContentNode(context page.Page, isReflink bool, ref string) (*contentNode, error) {
ref = filepath.ToSlash(strings.ToLower(strings.TrimSpace(ref)))
if ref == "" {
@ -215,9 +231,7 @@ func (c *PageCollections) getContentNode(context page.Page, isReflink bool, 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,
// but not when we get ./myarticle*, section/myarticle.
doSimpleLookup = ref[0] != '.' || ref[0] == '/' && strings.Count(ref, "/") == 1
doSimpleLookup = shouldDoSimpleLookup(ref)
}
if context != nil && !strings.HasPrefix(ref, "/") {

View file

@ -334,3 +334,52 @@ NOT FOUND
b.AssertFileContent("public/who/index.html", `NOT FOUND`)
}
// https://github.com/gohugoio/hugo/issues/7016
func TestGetPageMultilingual(t *testing.T) {
b := newTestSitesBuilder(t)
b.WithConfigFile("yaml", `
baseURL: "http://example.org/"
languageCode: "en-us"
defaultContentLanguage: ru
title: "My New Hugo Site"
uglyurls: true
languages:
ru: {}
en: {}
`)
b.WithContent(
"docs/1.md", "\n---title: p1\n---",
"news/1.md", "\n---title: p1\n---",
"news/1.en.md", "\n---title: p1en\n---",
"news/about/1.md", "\n---title: about1\n---",
"news/about/1.en.md", "\n---title: about1en\n---",
)
b.WithTemplates("index.html", `
{{ with site.GetPage "docs/1" }}
Docs p1: {{ .Title }}
{{ else }}
NOT FOUND
{{ end }}
`)
b.Build(BuildCfg{})
b.AssertFileContent("public/index.html", `Docs p1: p1`)
b.AssertFileContent("public/en/index.html", `NOT FOUND`)
}
func TestShouldDoSimpleLookup(t *testing.T) {
c := qt.New(t)
c.Assert(shouldDoSimpleLookup("foo.md"), qt.Equals, true)
c.Assert(shouldDoSimpleLookup("/foo.md"), qt.Equals, true)
c.Assert(shouldDoSimpleLookup("./foo.md"), qt.Equals, false)
c.Assert(shouldDoSimpleLookup("docs/foo.md"), qt.Equals, false)
}