summaryrefslogtreecommitdiffstats
path: root/hugolib/page.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugolib/page.go')
-rw-r--r--hugolib/page.go45
1 files changed, 29 insertions, 16 deletions
diff --git a/hugolib/page.go b/hugolib/page.go
index 1fefd945a..8a2864e7f 100644
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -22,6 +22,7 @@ import (
"unicode"
"github.com/gohugoio/hugo/media"
+ _errors "github.com/pkg/errors"
"github.com/gohugoio/hugo/common/maps"
@@ -307,13 +308,13 @@ func (p *Page) initContent() {
err = p.prepareForRender()
if err != nil {
- p.s.Log.ERROR.Printf("Failed to prepare page %q for render: %s", p.Path(), err)
+ c <- err
return
}
if len(p.summary) == 0 {
if err = p.setAutoSummary(); err != nil {
- err = fmt.Errorf("Failed to set user auto summary for page %q: %s", p.pathOrTitle(), err)
+ err = _errors.Wrapf(err, "Failed to set user auto summary for page %q:", p.pathOrTitle())
}
}
c <- err
@@ -324,11 +325,11 @@ func (p *Page) initContent() {
p.s.Log.WARN.Printf("WARNING: Timed out creating content for page %q (.Content will be empty). This is most likely a circular shortcode content loop that should be fixed. If this is just a shortcode calling a slow remote service, try to set \"timeout=20000\" (or higher, value is in milliseconds) in config.toml.\n", p.pathOrTitle())
case err := <-c:
if err != nil {
+ // TODO(bep) 2errors needs to be transported to the caller.
p.s.Log.ERROR.Println(err)
}
}
})
-
}
// This is sent to the shortcodes for this page. Not doing that will create an infinite regress. So,
@@ -989,11 +990,20 @@ func (s *Site) NewPage(name string) (*Page, error) {
return p, nil
}
+func (p *Page) errorf(err error, format string, a ...interface{}) error {
+ args := append([]interface{}{p.Lang(), p.pathOrTitle()}, a...)
+ format = "[%s] Page %q: " + format
+ if err == nil {
+ return fmt.Errorf(format, args...)
+ }
+ return _errors.Wrapf(err, format, args...)
+}
+
func (p *Page) ReadFrom(buf io.Reader) (int64, error) {
// Parse for metadata & body
if err := p.parse(buf); err != nil {
- p.s.Log.ERROR.Printf("%s for %s", err, p.File.Path())
- return 0, err
+ return 0, p.errorf(err, "parse failed")
+
}
return int64(len(p.rawContent)), nil
@@ -1205,7 +1215,7 @@ func (p *Page) initMainOutputFormat() error {
pageOutput, err := newPageOutput(p, false, false, outFormat)
if err != nil {
- return fmt.Errorf("Failed to create output page for type %q for page %q: %s", outFormat.Name, p.pathOrTitle(), err)
+ return _errors.Wrapf(err, "Failed to create output page for type %q for page %q:", outFormat.Name, p.pathOrTitle())
}
p.mainPageOutput = pageOutput
@@ -1271,7 +1281,7 @@ func (p *Page) prepareForRender() error {
// Note: The shortcodes in a page cannot access the page content it lives in,
// hence the withoutContent().
if workContentCopy, err = handleShortcodes(p.withoutContent(), workContentCopy); err != nil {
- s.Log.ERROR.Printf("Failed to handle shortcodes for page %s: %s", p.BaseFileName(), err)
+ return err
}
if p.Markup != "html" {
@@ -1294,8 +1304,6 @@ func (p *Page) prepareForRender() error {
return nil
}
-var ErrHasDraftAndPublished = errors.New("both draft and published parameters were found in page's frontmatter")
-
func (p *Page) update(frontmatter map[string]interface{}) error {
if frontmatter == nil {
return errors.New("missing frontmatter data")
@@ -1512,8 +1520,7 @@ func (p *Page) update(frontmatter map[string]interface{}) error {
if draft != nil && published != nil {
p.Draft = *draft
- p.s.Log.ERROR.Printf("page %s has both draft and published settings in its frontmatter. Using draft.", p.File.Path())
- return ErrHasDraftAndPublished
+ p.s.Log.WARN.Printf("page %q has both draft and published settings in its frontmatter. Using draft.", p.File.Path())
} else if draft != nil {
p.Draft = *draft
} else if published != nil {
@@ -1751,6 +1758,7 @@ func (p *Page) shouldRenderTo(f output.Format) bool {
func (p *Page) parse(reader io.Reader) error {
psr, err := parser.ReadFrom(reader)
+
if err != nil {
return err
}
@@ -1762,7 +1770,7 @@ func (p *Page) parse(reader io.Reader) error {
meta, err := psr.Metadata()
if err != nil {
- return fmt.Errorf("failed to parse page metadata for %q: %s", p.File.Path(), err)
+ return _errors.Wrap(err, "error in front matter")
}
if meta == nil {
// missing frontmatter equivalent to empty frontmatter
@@ -2079,7 +2087,7 @@ func (p *Page) decodeRefArgs(args map[string]interface{}) (refArgs, *SiteInfo, e
func (p *Page) Ref(argsm map[string]interface{}) (string, error) {
args, s, err := p.decodeRefArgs(argsm)
if err != nil {
- return "", fmt.Errorf("invalid arguments to Ref: %s", err)
+ return "", _errors.Wrap(err, "invalid arguments to Ref")
}
if s == nil {
@@ -2099,7 +2107,7 @@ func (p *Page) Ref(argsm map[string]interface{}) (string, error) {
func (p *Page) RelRef(argsm map[string]interface{}) (string, error) {
args, s, err := p.decodeRefArgs(argsm)
if err != nil {
- return "", fmt.Errorf("invalid arguments to Ref: %s", err)
+ return "", _errors.Wrap(err, "invalid arguments to Ref")
}
if s == nil {
@@ -2303,8 +2311,13 @@ func (p *Page) setValuesForKind(s *Site) {
// Used in error logs.
func (p *Page) pathOrTitle() string {
- if p.Path() != "" {
- return p.Path()
+ if p.Filename() != "" {
+ // Make a path relative to the working dir if possible.
+ filename := strings.TrimPrefix(p.Filename(), p.s.WorkingDir)
+ if filename != p.Filename() {
+ filename = strings.TrimPrefix(filename, helpers.FilePathSeparator)
+ }
+ return filename
}
return p.title
}