]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Improve nilpointer error message
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 1 Feb 2024 15:35:41 +0000 (16:35 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 1 Feb 2024 18:53:51 +0000 (19:53 +0100)
common/herrors/errors.go
hugolib/paginator_test.go
hugolib/site_render.go

index 59739a86adcbb831ba2286ef3a4c8caedad4e145..7c389c1aeaf06662df6ce66a100eee704df41d1a 100644 (file)
@@ -19,8 +19,10 @@ import (
        "fmt"
        "io"
        "os"
+       "regexp"
        "runtime"
        "runtime/debug"
+       "strings"
        "time"
 )
 
@@ -116,3 +118,22 @@ func IsNotExist(err error) bool {
 
        return false
 }
+
+var nilPointerErrRe = regexp.MustCompile(`at <(.*)>: error calling (.*?): runtime error: invalid memory address or nil pointer dereference`)
+
+func ImproveIfNilPointer(inErr error) (outErr error) {
+       outErr = inErr
+
+       m := nilPointerErrRe.FindStringSubmatch(inErr.Error())
+       if len(m) == 0 {
+               return
+       }
+       call := m[1]
+       field := m[2]
+       parts := strings.Split(call, ".")
+       receiverName := parts[len(parts)-2]
+       receiver := strings.Join(parts[:len(parts)-1], ".")
+       s := fmt.Sprintf("– %s is nil; wrap it in if or with: {{ with %s }}{{ .%s }}{{ end }}", receiverName, receiver, field)
+       outErr = errors.New(nilPointerErrRe.ReplaceAllString(inErr.Error(), s))
+       return
+}
index 2ce07805e255333893ecfa4467ffbc1d1e2a86a5..fb592bed18474112a576c667eaad6a89fbf525bd 100644 (file)
@@ -170,3 +170,15 @@ Paginator: {{ .Paginator }}
        b.Assert(err, qt.IsNotNil)
        b.Assert(err.Error(), qt.Contains, `error calling Paginator: pagination not supported for this page: kind: "page"`)
 }
+
+func TestNilPointerErrorMessage(t *testing.T) {
+       files := `
+-- hugo.toml --
+-- content/p1.md --
+-- layouts/_default/single.html --
+Home Filename: {{ site.Home.File.Filename }}
+`
+       b, err := TestE(t, files)
+       b.Assert(err, qt.IsNotNil)
+       b.Assert(err.Error(), qt.Contains, `_default/single.html:1:22: executing "_default/single.html" – File is nil; wrap it in if or with: {{ with site.Home.File }}{{ .Filename }}{{ end }}`)
+}
index 138530680aa21885741190fb181d1e2789826a3c..ef3e3aeefdb7800348e0d448ab52993be6f0e52d 100644 (file)
@@ -20,6 +20,7 @@ import (
        "strings"
        "sync"
 
+       "github.com/gohugoio/hugo/common/herrors"
        "github.com/gohugoio/hugo/hugolib/doctree"
 
        "github.com/gohugoio/hugo/config"
@@ -110,7 +111,7 @@ func (s *Site) renderPages(ctx *siteRenderContext) error {
 
        err := <-errs
        if err != nil {
-               return fmt.Errorf("failed to render pages: %w", err)
+               return fmt.Errorf("failed to render pages: %w", herrors.ImproveIfNilPointer(err))
        }
        return nil
 }