summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-06-13 18:01:23 +0200
committerGitHub <noreply@github.com>2023-06-13 18:01:23 +0200
commit60a2cdf72db31d746da21ab2e32b6c51830b5fd9 (patch)
treecbee7b1e8241ecf51f2dbbe1d74438a916aea99a
parente08cfc8ca0cb5b1a5872bcbed4011e6055e1ab9f (diff)
Fix config merge regression with root slices (e.g. disableKinds)
Fixes #11089
-rw-r--r--config/allconfig/allconfig.go18
-rw-r--r--hugolib/config_test.go68
2 files changed, 86 insertions, 0 deletions
diff --git a/config/allconfig/allconfig.go b/config/allconfig/allconfig.go
index ade9607dd..08792d870 100644
--- a/config/allconfig/allconfig.go
+++ b/config/allconfig/allconfig.go
@@ -191,6 +191,22 @@ type configCompiler interface {
func (c Config) cloneForLang() *Config {
x := c
x.C = nil
+ copyStringSlice := func(in []string) []string {
+ if in == nil {
+ return nil
+ }
+ out := make([]string, len(in))
+ copy(out, in)
+ return out
+ }
+
+ // Copy all the slices to avoid sharing.
+ x.DisableKinds = copyStringSlice(x.DisableKinds)
+ x.DisableLanguages = copyStringSlice(x.DisableLanguages)
+ x.MainSections = copyStringSlice(x.MainSections)
+ x.IgnoreErrors = copyStringSlice(x.IgnoreErrors)
+ x.IgnoreFiles = copyStringSlice(x.IgnoreFiles)
+ x.Theme = copyStringSlice(x.Theme)
// Collapse all static dirs to one.
x.StaticDir = x.staticDirs()
@@ -787,12 +803,14 @@ func fromLoadConfigResult(fs afero.Fs, logger loggers.Logger, res config.LoadCon
// Create a copy of the complete config and replace the root keys with the language specific ones.
clone := all.cloneForLang()
+
if err := decodeConfigFromParams(fs, bcfg, mergedConfig, clone, differentRootKeys); err != nil {
return nil, fmt.Errorf("failed to decode config for language %q: %w", k, err)
}
if err := clone.CompileConfig(logger); err != nil {
return nil, err
}
+
langConfigMap[k] = clone
case maps.ParamsMergeStrategy:
default:
diff --git a/hugolib/config_test.go b/hugolib/config_test.go
index 7f278f00a..5a3087207 100644
--- a/hugolib/config_test.go
+++ b/hugolib/config_test.go
@@ -750,6 +750,74 @@ author: {{ site.Author }}
}
+// Issue #11089
+func TestHugoConfigSliceOverrides(t *testing.T) {
+ t.Parallel()
+
+ filesTemplate := `
+-- hugo.toml --
+disableKinds = ["section"]
+[languages]
+[languages.en]
+disableKinds = []
+title = "English"
+weigHt = WEIGHT_EN
+[languages.sv]
+title = "Swedish"
+wEight = WEIGHT_SV
+disableKinds = ["page"]
+-- layouts/index.html --
+Home: {{ .Lang}}|{{ len site.RegularPages }}|
+-- layouts/_default/single.html --
+Single.
+-- content/p1.en.md --
+-- content/p2.en.md --
+-- content/p1.sv.md --
+-- content/p2.sv.md --
+
+`
+
+ t.Run("En first", func(t *testing.T) {
+ files := strings.ReplaceAll(filesTemplate, "WEIGHT_EN", "1")
+ files = strings.ReplaceAll(files, "WEIGHT_SV", "2")
+
+ cfg := config.New()
+ b, err := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ BaseCfg: cfg,
+ },
+ ).BuildE()
+
+ b.Assert(err, qt.IsNil)
+ b.AssertFileContent("public/index.html", "Home: en|2|")
+ b.AssertFileContent("public/sv/index.html", "Home: sv|0|")
+
+ })
+
+ t.Run("Sv first", func(t *testing.T) {
+ files := strings.ReplaceAll(filesTemplate, "WEIGHT_EN", "2")
+ files = strings.ReplaceAll(files, "WEIGHT_SV", "1")
+
+ for i := 0; i < 20; i++ {
+ cfg := config.New()
+ b, err := NewIntegrationTestBuilder(
+ IntegrationTestConfig{
+ T: t,
+ TxtarString: files,
+ BaseCfg: cfg,
+ },
+ ).BuildE()
+
+ b.Assert(err, qt.IsNil)
+ b.AssertFileContent("public/index.html", "Home: en|2|")
+ b.AssertFileContent("public/sv/index.html", "Home: sv|0|")
+ }
+ })
+
+}
+
func TestConfigOutputFormatDefinedInTheme(t *testing.T) {
t.Parallel()