hugolib: Make sure ambiguous lookups in GetPage gets an error

See #5138
This commit is contained in:
Bjørn Erik Pedersen 2018-09-05 10:31:15 +02:00
parent df50c108ba
commit 75e54345f9

View file

@ -206,40 +206,57 @@ func (c *PageCollections) getPage(typ string, sections ...string) *Page {
// Ref is either unix-style paths (i.e. callers responsible for // Ref is either unix-style paths (i.e. callers responsible for
// calling filepath.ToSlash as necessary) or shorthand refs. // calling filepath.ToSlash as necessary) or shorthand refs.
func (c *PageCollections) getPageNew(context *Page, ref string) (*Page, error) { func (c *PageCollections) getPageNew(context *Page, ref string) (*Page, error) {
var anError error
// Absolute (content root relative) reference. // Absolute (content root relative) reference.
if strings.HasPrefix(ref, "/") { if strings.HasPrefix(ref, "/") {
if p, err := c.getFromCache(ref); err == nil && p != nil { p, err := c.getFromCache(ref)
if err == nil && p != nil {
return p, nil return p, nil
} }
if err != nil {
anError = err
}
} else if context != nil { } else if context != nil {
// Try the page-relative path. // Try the page-relative path.
ppath := path.Join("/", strings.Join(context.sections, "/"), ref) ppath := path.Join("/", strings.Join(context.sections, "/"), ref)
if p, err := c.getFromCache(ppath); err == nil && p != nil { p, err := c.getFromCache(ppath)
if err == nil && p != nil {
return p, nil return p, nil
} }
if err != nil {
anError = err
}
} }
if !strings.HasPrefix(ref, "/") { if !strings.HasPrefix(ref, "/") {
// Many people will have "post/foo.md" in their content files. // Many people will have "post/foo.md" in their content files.
if p, err := c.getFromCache("/" + ref); err == nil && p != nil { p, err := c.getFromCache("/" + ref)
if err == nil && p != nil {
if context != nil { if context != nil {
// TODO(bep) remove this case and the message below when the storm has passed // TODO(bep) remove this case and the message below when the storm has passed
helpers.DistinctFeedbackLog.Printf(`WARNING: make non-relative ref/relref page reference(s) in page %q absolute, e.g. {{< ref "/blog/my-post.md" >}}`, context.absoluteSourceRef()) helpers.DistinctFeedbackLog.Printf(`WARNING: make non-relative ref/relref page reference(s) in page %q absolute, e.g. {{< ref "/blog/my-post.md" >}}`, context.absoluteSourceRef())
} }
return p, nil return p, nil
} }
if err != nil {
anError = err
}
} }
// Last try. // Last try.
ref = strings.TrimPrefix(ref, "/") ref = strings.TrimPrefix(ref, "/")
p, err := c.getFromCache(ref) p, err := c.getFromCache(ref)
if err != nil { if err != nil {
anError = err
}
if p == nil && anError != nil {
if context != nil { if context != nil {
return nil, fmt.Errorf("failed to resolve path from page %q: %s", context.absoluteSourceRef(), err) return nil, fmt.Errorf("failed to resolve path from page %q: %s", context.absoluteSourceRef(), anError)
} }
return nil, fmt.Errorf("failed to resolve page: %s", err) return nil, fmt.Errorf("failed to resolve page: %s", anError)
} }
return p, nil return p, nil