ref: 6d95dc9d74681cba53b46e79c6e1d58d27fcdfb0
parent: 56a343507ca28254edb891bc1c21b6c8ca017982
author: Cameron Moore <moorereason@gmail.com>
date: Wed Oct 28 17:44:38 EDT 2020
tpl: Fix reflection bug in merge Value.Type().Key() must only be called on map values. Fixes #7899
--- a/tpl/collections/merge.go
+++ b/tpl/collections/merge.go
@@ -106,6 +106,10 @@
dve := dv.Elem()
if dve.Kind() == reflect.Map {
sve := sv.Elem()
+ if sve.Kind() != reflect.Map {
+ continue
+ }
+
if dve.Type().Key() == sve.Type().Key() {
out.SetMapIndex(key, mergeMap(dve, sve))
}
--- a/tpl/collections/merge_test.go
+++ b/tpl/collections/merge_test.go
@@ -111,6 +111,15 @@
},
maps.Params{"a": 1, "b": maps.Params{"d": 1, "e": 2, "f": 3}, "c": 3}, false,
},
+ {
+ // https://github.com/gohugoio/hugo/issues/7899
+ "matching keys with non-map src value",
+ []interface{}{
+ map[string]interface{}{"k": "v"},
+ map[string]interface{}{"k": map[string]interface{}{"k2": "v2"}},
+ },
+ map[string]interface{}{"k": map[string]interface{}{"k2": "v2"}}, false,
+ },
{"src nil", []interface{}{nil, simpleMap}, simpleMap, false},
// Error cases.
{"dst not a map", []interface{}{nil, "not a map"}, nil, true},