mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-21 21:35:28 +02:00
Improve error messages, esp. when the server is running
* Add file context to minifier errors when publishing * Misc fixes (see issues) * Allow custom server error template in layouts/server/error.html To get to this, this commit also cleans up and simplifies the code surrounding errors and files. This also removes the usage of `github.com/pkg/errors`, mostly because of https://github.com/pkg/errors/issues/223 -- but also because most of this is now built-in to Go. Fixes #9852 Fixes #9857 Fixes #9863
This commit is contained in:
@@ -15,6 +15,7 @@ package hugolib
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
@@ -33,9 +34,10 @@ import (
|
||||
"github.com/gohugoio/hugo/output"
|
||||
"github.com/gohugoio/hugo/parser/metadecoders"
|
||||
|
||||
"errors"
|
||||
|
||||
"github.com/gohugoio/hugo/common/para"
|
||||
"github.com/gohugoio/hugo/hugofs"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/gohugoio/hugo/source"
|
||||
|
||||
@@ -194,7 +196,7 @@ func (h *hugoSitesInit) Reset() {
|
||||
|
||||
func (h *HugoSites) Data() map[string]any {
|
||||
if _, err := h.init.data.Do(); err != nil {
|
||||
h.SendError(errors.Wrap(err, "failed to load data"))
|
||||
h.SendError(fmt.Errorf("failed to load data: %w", err))
|
||||
return nil
|
||||
}
|
||||
return h.data
|
||||
@@ -242,7 +244,7 @@ func (h *HugoSites) pickOneAndLogTheRest(errors []error) error {
|
||||
for j, err := range errors {
|
||||
// If this is in server mode, we want to return an error to the client
|
||||
// with a file context, if possible.
|
||||
if herrors.UnwrapErrorWithFileContext(err) != nil {
|
||||
if herrors.UnwrapFileError(err) != nil {
|
||||
i = j
|
||||
break
|
||||
}
|
||||
@@ -327,7 +329,7 @@ func newHugoSites(cfg deps.DepsCfg, sites ...*Site) (*HugoSites, error) {
|
||||
|
||||
langConfig, err := newMultiLingualFromSites(cfg.Cfg, sites...)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to create language config")
|
||||
return nil, fmt.Errorf("failed to create language config: %w", err)
|
||||
}
|
||||
|
||||
var contentChangeTracker *contentChangeMap
|
||||
@@ -365,7 +367,7 @@ func newHugoSites(cfg deps.DepsCfg, sites ...*Site) (*HugoSites, error) {
|
||||
h.init.data.Add(func() (any, error) {
|
||||
err := h.loadData(h.PathSpec.BaseFs.Data.Dirs)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to load data")
|
||||
return nil, fmt.Errorf("failed to load data: %w", err)
|
||||
}
|
||||
return nil, nil
|
||||
})
|
||||
@@ -391,7 +393,7 @@ func newHugoSites(cfg deps.DepsCfg, sites ...*Site) (*HugoSites, error) {
|
||||
h.init.gitInfo.Add(func() (any, error) {
|
||||
err := h.loadGitInfo()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to load Git info")
|
||||
return nil, fmt.Errorf("failed to load Git info: %w", err)
|
||||
}
|
||||
return nil, nil
|
||||
})
|
||||
@@ -402,7 +404,7 @@ func newHugoSites(cfg deps.DepsCfg, sites ...*Site) (*HugoSites, error) {
|
||||
|
||||
var l configLoader
|
||||
if err := l.applyDeps(cfg, sites...); err != nil {
|
||||
initErr = errors.Wrap(err, "add site dependencies")
|
||||
initErr = fmt.Errorf("add site dependencies: %w", err)
|
||||
}
|
||||
|
||||
h.Deps = sites[0].Deps
|
||||
@@ -485,7 +487,7 @@ func (l configLoader) applyDeps(cfg deps.DepsCfg, sites ...*Site) error {
|
||||
|
||||
siteConfig, err := l.loadSiteConfig(s.language)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "load site config")
|
||||
return fmt.Errorf("load site config: %w", err)
|
||||
}
|
||||
s.siteConfigConfig = siteConfig
|
||||
|
||||
@@ -516,17 +518,17 @@ func (l configLoader) applyDeps(cfg deps.DepsCfg, sites ...*Site) error {
|
||||
var err error
|
||||
d, err = deps.New(cfg)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "create deps")
|
||||
return fmt.Errorf("create deps: %w", err)
|
||||
}
|
||||
|
||||
d.OutputFormatsConfig = s.outputFormatsConfig
|
||||
|
||||
if err := onCreated(d); err != nil {
|
||||
return errors.Wrap(err, "on created")
|
||||
return fmt.Errorf("on created: %w", err)
|
||||
}
|
||||
|
||||
if err = d.LoadResources(); err != nil {
|
||||
return errors.Wrap(err, "load resources")
|
||||
return fmt.Errorf("load resources: %w", err)
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -548,7 +550,7 @@ func NewHugoSites(cfg deps.DepsCfg) (*HugoSites, error) {
|
||||
}
|
||||
sites, err := createSitesFromConfig(cfg)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "from config")
|
||||
return nil, fmt.Errorf("from config: %w", err)
|
||||
}
|
||||
return newHugoSites(cfg, sites...)
|
||||
}
|
||||
@@ -882,7 +884,7 @@ func (h *HugoSites) handleDataFile(r source.File) error {
|
||||
|
||||
f, err := r.FileInfo().Meta().Open()
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "data: failed to open %q:", r.LogicalName())
|
||||
return fmt.Errorf("data: failed to open %q: %w", r.LogicalName(), err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
@@ -960,23 +962,16 @@ func (h *HugoSites) errWithFileContext(err error, f source.File) error {
|
||||
if !ok {
|
||||
return err
|
||||
}
|
||||
|
||||
realFilename := fim.Meta().Filename
|
||||
|
||||
err, _ = herrors.WithFileContextForFile(
|
||||
err,
|
||||
realFilename,
|
||||
realFilename,
|
||||
h.SourceSpec.Fs.Source,
|
||||
herrors.SimpleLineMatcher)
|
||||
return herrors.NewFileErrorFromFile(err, realFilename, realFilename, h.SourceSpec.Fs.Source, herrors.SimpleLineMatcher)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (h *HugoSites) readData(f source.File) (any, error) {
|
||||
file, err := f.FileInfo().Meta().Open()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "readData: failed to open data file")
|
||||
return nil, fmt.Errorf("readData: failed to open data file: %w", err)
|
||||
}
|
||||
defer file.Close()
|
||||
content := helpers.ReaderToBytes(file)
|
||||
|
Reference in New Issue
Block a user