Fix panic with debug.Dump with Page when running the server

This replaces the current implementation with `json.MarshalIndent` which doesn't produce the same output, but at least it doesn't crash.

There's a bug in the upstream `litter` library. This can probably be fixed, but that needs to wait.

I have tested `go-spew` which does not crash, but it is very data racy in this context.

FIxes #12309
This commit is contained in:
Bjørn Erik Pedersen 2024-03-26 10:43:08 +01:00
parent ebfca61ac4
commit 38e05bd3c7
3 changed files with 37 additions and 3 deletions

View file

@ -15,12 +15,12 @@
package debug package debug
import ( import (
"encoding/json"
"sort" "sort"
"sync" "sync"
"time" "time"
"github.com/bep/logg" "github.com/bep/logg"
"github.com/sanity-io/litter"
"github.com/spf13/cast" "github.com/spf13/cast"
"github.com/yuin/goldmark/util" "github.com/yuin/goldmark/util"
@ -108,7 +108,11 @@ type Namespace struct {
// Also note that the output from Dump may change from Hugo version to the next, // Also note that the output from Dump may change from Hugo version to the next,
// so don't depend on a specific output. // so don't depend on a specific output.
func (ns *Namespace) Dump(val any) string { func (ns *Namespace) Dump(val any) string {
return litter.Sdump(val) b, err := json.MarshalIndent(val, "", " ")
if err != nil {
return ""
}
return string(b)
} }
// VisualizeSpaces returns a string with spaces replaced by a visible string. // VisualizeSpaces returns a string with spaces replaced by a visible string.

View file

@ -43,3 +43,33 @@ disableKinds = ["taxonomy", "term"]
b.AssertLogContains("timer: name foo count 5 duration") b.AssertLogContains("timer: name foo count 5 duration")
} }
func TestDebugDumpPage(t *testing.T) {
files := `
-- hugo.toml --
baseURL = "https://example.org/"
disableLiveReload = true
[taxonomies]
tag = "tags"
-- content/_index.md --
---
title: "The Index"
date: 2012-03-15
---
-- content/p1.md --
---
title: "The First"
tags: ["a", "b"]
---
-- layouts/_default/list.html --
Dump: {{ debug.Dump . | safeHTML }}
Dump Site: {{ debug.Dump site }}
Dum site.Taxonomies: {{ debug.Dump site.Taxonomies | safeHTML }}
-- layouts/_default/single.html --
Dump: {{ debug.Dump . | safeHTML }}
`
b := hugolib.TestRunning(t, files)
b.AssertFileContent("public/index.html", "Dump: {\n \"Date\": \"2012-03-15T00:00:00Z\"")
}

View file

@ -36,7 +36,7 @@ func init() {
[][2]string{ [][2]string{
{`{{ $m := newScratch }} {`{{ $m := newScratch }}
{{ $m.Set "Hugo" "Rocks!" }} {{ $m.Set "Hugo" "Rocks!" }}
{{ $m.Values | debug.Dump | safeHTML }}`, "map[string]interface {}{\n \"Hugo\": \"Rocks!\",\n}"}, {{ $m.Values | debug.Dump | safeHTML }}`, "{\n \"Hugo\": \"Rocks!\"\n}"},
}, },
) )