Skip to content

Commit

Permalink
Fix config merge regression with root slices (e.g. disableKinds)
Browse files Browse the repository at this point in the history
Fixes #11089
  • Loading branch information
bep committed Jun 13, 2023
1 parent e08cfc8 commit 60a2cdf
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 0 deletions.
18 changes: 18 additions & 0 deletions config/allconfig/allconfig.go
Expand Up @@ -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()
Expand Down Expand Up @@ -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:
Expand Down
68 changes: 68 additions & 0 deletions hugolib/config_test.go
Expand Up @@ -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()

Expand Down

0 comments on commit 60a2cdf

Please sign in to comment.