Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-06-27 14:24:49 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-06-27 16:01:56 +0300
commit19aa95fc7f4cd58dcc8a8ff075762cfc86d41dc3 (patch)
tree59b96d8099fb7a18e7e55ba9a115163c9dea6043 /config
parent923dd9d1c1f649142f3f377109318b07e0f44d5d (diff)
Fix config handling with empty config entries after merge
Fixes #8701
Diffstat (limited to 'config')
-rw-r--r--config/defaultConfigProvider.go10
-rw-r--r--config/defaultConfigProvider_test.go20
2 files changed, 28 insertions, 2 deletions
diff --git a/config/defaultConfigProvider.go b/config/defaultConfigProvider.go
index a5e2d09fd..80353664e 100644
--- a/config/defaultConfigProvider.go
+++ b/config/defaultConfigProvider.go
@@ -214,6 +214,7 @@ func (c *defaultConfigProvider) Merge(k string, v interface{}) {
if p, ok := maps.ToParamsAndPrepare(v); ok {
// As there may be keys in p not in root, we need to handle
// those as a special case.
+ var keysToDelete []string
for kk, vv := range p {
if pp, ok := vv.(maps.Params); ok {
if pppi, ok := c.root[kk]; ok {
@@ -261,14 +262,19 @@ func (c *defaultConfigProvider) Merge(k string, v interface{}) {
strategy := c.determineMergeStrategy(KeyParams{Key: "", Params: c.root}, KeyParams{Key: kk, Params: np})
np.SetDefaultMergeStrategy(strategy)
np.Merge(pp)
- if len(np) > 0 {
- c.root[kk] = np
+ c.root[kk] = np
+ if np.IsZero() {
+ // Just keep it until merge is done.
+ keysToDelete = append(keysToDelete, kk)
}
}
}
}
// Merge the rest.
c.root.Merge(p)
+ for _, k := range keysToDelete {
+ delete(c.root, k)
+ }
} else {
panic(fmt.Sprintf("unsupported type %T received in Merge", v))
}
diff --git a/config/defaultConfigProvider_test.go b/config/defaultConfigProvider_test.go
index 6752ab2e5..7ab8c049a 100644
--- a/config/defaultConfigProvider_test.go
+++ b/config/defaultConfigProvider_test.go
@@ -283,6 +283,26 @@ func TestDefaultConfigProvider(t *testing.T) {
})
+ // Issue #8701
+ c.Run("Prevent _merge only maps", func(c *qt.C) {
+ cfg := New()
+
+ cfg.Set("", map[string]interface{}{
+ "B": "bv",
+ })
+
+ cfg.Merge("", map[string]interface{}{
+ "c": map[string]interface{}{
+ "_merge": "shallow",
+ "d": "dv2",
+ },
+ })
+
+ c.Assert(cfg.Get(""), qt.DeepEquals, maps.Params{
+ "b": "bv",
+ })
+ })
+
c.Run("IsSet", func(c *qt.C) {
cfg := New()