import (
"errors"
"fmt"
- "io"
"os"
"regexp"
- "runtime"
"runtime/debug"
"strings"
"time"
)
-// PrintStackTrace prints the current stacktrace to w.
-func PrintStackTrace(w io.Writer) {
- buf := make([]byte, 1<<16)
- runtime.Stack(buf, true)
- fmt.Fprintf(w, "%s", buf)
-}
-
// ErrorSender is a, typically, non-blocking error handler.
type ErrorSender interface {
SendError(err error)
err := d.UnmarshalTo(data, f, &m)
+ if m == nil {
+ // We migrated to github.com/goccy/go-yaml in v0.152.0,
+ // which produces nil maps for empty YAML files (and empty map nodes), unlike gopkg.in/yaml.v2.
+ //
+ // To prevent crashes when trying to handle empty config files etc., we ensure we always return a non-nil map here.
+ // See issue 14074.
+ m = make(map[string]any)
+ }
+
return m, err
}
--- /dev/null
+// Copyright 2025 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package metadecoders_test
+
+import (
+ "testing"
+
+ "github.com/gohugoio/hugo/hugolib"
+)
+
+func TestYAMLIntegerSortIssue14078(t *testing.T) {
+ files := `
+-- assets/mydata.yaml --
+a:
+ weight: 1
+x:
+ weight: 2
+c:
+ weight: 3
+t:
+ weight: 4
+
+-- layouts/all.html --
+{{ $mydata := resources.Get "mydata.yaml" | transform.Unmarshal }}
+Sorted: {{ sort $mydata "weight" }}|
+
+`
+
+ b := hugolib.Test(t, files)
+
+ b.AssertFileContent("public/index.html", "Sorted: [map[weight:1] map[weight:2] map[weight:3] map[weight:4]]|")
+}