aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <[email protected]>2021-03-21 10:54:30 +0100
committerBjørn Erik Pedersen <[email protected]>2021-03-21 10:54:30 +0100
commitfc06e85082b63a54d9403e57c8d01a7d5a62fc04 (patch)
tree1bfc361d5290ca0742908d8f5feb2de10828a201
parentb725253f9e3033e18bd45096c0622e6fb7b1ff79 (diff)
downloadhugo-fc06e85082b63a54d9403e57c8d01a7d5a62fc04.tar.gz
hugo-fc06e85082b63a54d9403e57c8d01a7d5a62fc04.zip
Apply OS env overrides twice
The recent fix for #8346 had an unfortunate side-effect, as it prevented overrides of config options used in the module collector, e.g. `HUGO_MODULE_REPLACEMENTS`. This commit fixes that by applying the overrides twice.
-rw-r--r--hugolib/config.go123
1 files changed, 69 insertions, 54 deletions
diff --git a/hugolib/config.go b/hugolib/config.go
index fe138bf20..d96f314b1 100644
--- a/hugolib/config.go
+++ b/hugolib/config.go
@@ -18,9 +18,10 @@ import (
"path/filepath"
"strings"
- "github.com/gohugoio/hugo/common/maps"
"github.com/gohugoio/hugo/common/types"
+ "github.com/gohugoio/hugo/common/maps"
+
"github.com/gobwas/glob"
hglob "github.com/gohugoio/hugo/hugofs/glob"
@@ -166,6 +167,71 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
}
}
+ applyOsEnvOverrides := func() error {
+
+ const delim = "__env__delim"
+
+ // Apply environment overrides
+ if len(d.Environ) > 0 {
+ // Extract all that start with the HUGO prefix.
+ // The delimiter is the following rune, usually "_".
+ const hugoEnvPrefix = "HUGO"
+ var hugoEnv []types.KeyValueStr
+ for _, v := range d.Environ {
+ key, val := config.SplitEnvVar(v)
+ if strings.HasPrefix(key, hugoEnvPrefix) {
+ delimiterAndKey := strings.TrimPrefix(key, hugoEnvPrefix)
+ if len(delimiterAndKey) < 2 {
+ continue
+ }
+ // Allow delimiters to be case sensitive.
+ // It turns out there isn't that many allowed special
+ // chars in environment variables when used in Bash and similar,
+ // so variables on the form HUGOxPARAMSxFOO=bar is one option.
+ key := strings.ReplaceAll(delimiterAndKey[1:], delimiterAndKey[:1], delim)
+ key = strings.ToLower(key)
+ hugoEnv = append(hugoEnv, types.KeyValueStr{
+ Key: key,
+ Value: val,
+ })
+
+ }
+ }
+
+ for _, env := range hugoEnv {
+ existing, nestedKey, owner, err := maps.GetNestedParamFn(env.Key, delim, v.Get)
+ if err != nil {
+ return err
+ }
+
+ if existing != nil {
+ val, err := metadecoders.Default.UnmarshalStringTo(env.Value, existing)
+ if err != nil {
+ continue
+ }
+
+ if owner != nil {
+ owner[nestedKey] = val
+ } else {
+ v.Set(env.Key, val)
+ }
+ } else if nestedKey != "" {
+ owner[nestedKey] = env.Value
+ } else {
+ v.Set(env.Key, env.Value)
+ }
+ }
+
+ }
+
+ return nil
+
+ }
+
+ if err := applyOsEnvOverrides(); err != nil {
+ return v, configFiles, err
+ }
+
// We made this a Glob pattern in Hugo 0.75, we don't need both.
if v.GetBool("ignoreVendor") {
helpers.Deprecated("--ignoreVendor", "--ignoreVendorPaths **", false)
@@ -200,59 +266,8 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
configFiles = append(configFiles, modulesConfigFiles...)
}
- const delim = "__env__delim"
-
- // Apply environment overrides
- if len(d.Environ) > 0 {
- // Extract all that start with the HUGO prefix.
- // The delimiter is the following rune, usually "_".
- const hugoEnvPrefix = "HUGO"
- var hugoEnv []types.KeyValueStr
- for _, v := range d.Environ {
- key, val := config.SplitEnvVar(v)
- if strings.HasPrefix(key, hugoEnvPrefix) {
- delimiterAndKey := strings.TrimPrefix(key, hugoEnvPrefix)
- if len(delimiterAndKey) < 2 {
- continue
- }
- // Allow delimiters to be case sensitive.
- // It turns out there isn't that many allowed special
- // chars in environment variables when used in Bash and similar,
- // so variables on the form HUGOxPARAMSxFOO=bar is one option.
- key := strings.ReplaceAll(delimiterAndKey[1:], delimiterAndKey[:1], delim)
- key = strings.ToLower(key)
- hugoEnv = append(hugoEnv, types.KeyValueStr{
- Key: key,
- Value: val,
- })
-
- }
- }
-
- for _, env := range hugoEnv {
- existing, nestedKey, owner, err := maps.GetNestedParamFn(env.Key, delim, v.Get)
- if err != nil {
- return v, configFiles, err
- }
-
- if existing != nil {
- val, err := metadecoders.Default.UnmarshalStringTo(env.Value, existing)
- if err != nil {
- continue
- }
-
- if owner != nil {
- owner[nestedKey] = val
- } else {
- v.Set(env.Key, val)
- }
- } else if nestedKey != "" {
- owner[nestedKey] = env.Value
- } else {
- v.Set(env.Key, env.Value)
- }
- }
-
+ if err := applyOsEnvOverrides(); err != nil {
+ return v, configFiles, err
}
return v, configFiles, err