diff options
author | Cameron Moore <[email protected]> | 2020-10-28 21:44:38 -0500 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2020-10-29 19:19:41 +0100 |
commit | 6d95dc9d74681cba53b46e79c6e1d58d27fcdfb0 (patch) | |
tree | e33858db9c3251ca6d2923e84b2c522f04351061 | |
parent | 56a343507ca28254edb891bc1c21b6c8ca017982 (diff) | |
download | hugo-6d95dc9d74681cba53b46e79c6e1d58d27fcdfb0.tar.gz hugo-6d95dc9d74681cba53b46e79c6e1d58d27fcdfb0.zip |
tpl: Fix reflection bug in merge
Value.Type().Key() must only be called on map values.
Fixes #7899
-rw-r--r-- | tpl/collections/merge.go | 4 | ||||
-rw-r--r-- | tpl/collections/merge_test.go | 9 |
2 files changed, 13 insertions, 0 deletions
diff --git a/tpl/collections/merge.go b/tpl/collections/merge.go index 029416142..de59de0af 100644 --- a/tpl/collections/merge.go +++ b/tpl/collections/merge.go @@ -106,6 +106,10 @@ func mergeMap(dst, src reflect.Value) reflect.Value { 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)) } diff --git a/tpl/collections/merge_test.go b/tpl/collections/merge_test.go index dbe92d8b2..92c973cd4 100644 --- a/tpl/collections/merge_test.go +++ b/tpl/collections/merge_test.go @@ -111,6 +111,15 @@ func TestMerge(t *testing.T) { }, 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}, |