Fix config loading for "hugo mod init"
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 27 Jun 2021 10:03:43 +0000 (12:03 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sun, 27 Jun 2021 10:03:43 +0000 (12:03 +0200)
We have some commands that will continue even if the config loading fails (e.g. because a module can not be found). In Hugo 0.84.0 we introduced a new `_merge` flag that we removed once the configuration was loaded. But we did not do that in error situations, leading to failures in some situations.

This commit fixes that by making sure the configuration is always cleaned before return, even in error situations.

Fixes #8697

hugolib/config.go

index a0ce9804252206a854a1ddef3b40acd28eab231f..3e3700433a27b979dcef0d0f3657a7c46be07708 100644 (file)
@@ -63,6 +63,10 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
        var configFiles []string
 
        l := configLoader{ConfigSourceDescriptor: d, cfg: config.New()}
+       // Make sure we always do this, even in error situations,
+       // as we have commands (e.g. "hugo mod init") that will
+       // use a partial configuration to do its job.
+       defer l.deleteMergeStrategies()
 
        for _, name := range d.configFilenames() {
                var filename string
@@ -125,10 +129,7 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
        collectHook := func(m *modules.ModulesConfig) error {
                // We don't need the merge strategy configuration anymore,
                // remove it so it doesn't accidentaly show up in other settings.
-               l.cfg.WalkParams(func(params ...config.KeyParams) bool {
-                       params[len(params)-1].Params.DeleteMergeStrategy()
-                       return false
-               })
+               l.deleteMergeStrategies()
 
                if err := l.loadLanguageSettings(nil); err != nil {
                        return err
@@ -461,6 +462,13 @@ func (l configLoader) loadConfig(configName string) (string, error) {
        return filename, nil
 }
 
+func (l configLoader) deleteMergeStrategies() {
+       l.cfg.WalkParams(func(params ...config.KeyParams) bool {
+               params[len(params)-1].Params.DeleteMergeStrategy()
+               return false
+       })
+}
+
 func (l configLoader) loadLanguageSettings(oldLangs langs.Languages) error {
        _, err := langs.LoadLanguageSettings(l.cfg, oldLangs)
        return err