From c406fd3a0e0efa17f69095ca6317ba1036fc8964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 16 Jul 2023 10:42:13 +0200 Subject: Fix setting config from env with complex (e.g. YAML) strings So you can do ``` HUGO_OUTPUTS="home: [rss]" hugo ``` And similar. Fixes #11249 --- config/allconfig/alldecoders.go | 2 +- config/allconfig/load.go | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'config') diff --git a/config/allconfig/alldecoders.go b/config/allconfig/alldecoders.go index a40a02372..6b8a4568c 100644 --- a/config/allconfig/alldecoders.go +++ b/config/allconfig/alldecoders.go @@ -150,7 +150,7 @@ var allDecoderSetups = map[string]decodeWeight{ key: "outputs", decode: func(d decodeWeight, p decodeConfig) error { defaults := createDefaultOutputFormats(p.c.OutputFormats.Config) - m := p.p.GetStringMap("outputs") + m := maps.CleanConfigStringMap(p.p.GetStringMap("outputs")) p.c.Outputs = make(map[string][]string) for k, v := range m { s := types.ToStringSlicePreserveString(v) diff --git a/config/allconfig/load.go b/config/allconfig/load.go index b9bb38aaf..8551039a0 100644 --- a/config/allconfig/load.go +++ b/config/allconfig/load.go @@ -293,11 +293,19 @@ func (l configLoader) applyOsEnvOverrides(environ []string) error { } else { l.cfg.Set(env.Key, val) } - } else if nestedKey != "" { - owner[nestedKey] = env.Value } else { - // The container does not exist yet. - l.cfg.Set(strings.ReplaceAll(env.Key, delim, "."), env.Value) + if nestedKey != "" { + owner[nestedKey] = env.Value + } else { + var val any = env.Value + if _, ok := allDecoderSetups[env.Key]; ok { + // A map. + val, err = metadecoders.Default.UnmarshalStringTo(env.Value, map[string]interface{}{}) + } + if err == nil { + l.cfg.Set(strings.ReplaceAll(env.Key, delim, "."), val) + } + } } } -- cgit v1.2.3