tpl: Fix reflection bug in merge
authorCameron Moore <moorereason@gmail.com>
Thu, 29 Oct 2020 02:44:38 +0000 (21:44 -0500)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 29 Oct 2020 18:19:41 +0000 (19:19 +0100)
Value.Type().Key() must only be called on map values.

Fixes #7899

tpl/collections/merge.go
tpl/collections/merge_test.go

index 0294161424545e302909614698962b4429f1e8a4..de59de0af9669570518f6b2638fad3d02b22e898 100644 (file)
@@ -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))
                                }
index dbe92d8b234a63f777949222f98aa95ed4ac3a0d..92c973cd4dfc03c3f06796edfac80dba388232f4 100644 (file)
@@ -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},