From 6d95dc9d74681cba53b46e79c6e1d58d27fcdfb0 Mon Sep 17 00:00:00 2001 From: Cameron Moore Date: Wed, 28 Oct 2020 21:44:38 -0500 Subject: [PATCH] tpl: Fix reflection bug in merge Value.Type().Key() must only be called on map values. Fixes #7899 --- tpl/collections/merge.go | 4 ++++ tpl/collections/merge_test.go | 9 +++++++++ 2 files changed, 13 insertions(+) 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},