summaryrefslogtreecommitdiffstats
path: root/hugolib
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-06-16 19:11:01 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2021-06-18 12:54:30 +0200
commitbb2aa08709c812a5be29922a1a7f4d814e200cab (patch)
treea709117fe1a882b0179e41db0d72b103f53a4f6a /hugolib
parent9096842b0494166e401cc08a70b93ae2ee19a198 (diff)
Implement configuration in a directory for modules
Fixes #8654
Diffstat (limited to 'hugolib')
-rw-r--r--hugolib/config.go115
-rw-r--r--hugolib/config_test.go53
2 files changed, 64 insertions, 104 deletions
diff --git a/hugolib/config.go b/hugolib/config.go
index 091827660..cad845199 100644
--- a/hugolib/config.go
+++ b/hugolib/config.go
@@ -79,10 +79,16 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
}
if d.AbsConfigDir != "" {
- dirnames, err := l.loadConfigFromConfigDir()
+ dcfg, dirnames, err := config.LoadConfigFromDir(l.Fs, d.AbsConfigDir, l.Environment)
if err == nil {
- configFiles = append(configFiles, dirnames...)
+ if len(dirnames) > 0 {
+ l.cfg.Set("", dcfg.Get(""))
+ configFiles = append(configFiles, dirnames...)
+ }
} else if err != ErrNoConfigFile {
+ if len(dirnames) > 0 {
+ return nil, nil, l.wrapFileError(err, dirnames[0])
+ }
return nil, nil, err
}
}
@@ -381,9 +387,9 @@ func (l configLoader) collectModules(modConfig modules.Config, v1 config.Provide
hook := func(m *modules.ModulesConfig) error {
for _, tc := range m.ActiveModules {
- if tc.ConfigFilename() != "" {
+ if len(tc.ConfigFilenames()) > 0 {
if tc.Watch() {
- configFilenames = append(configFilenames, tc.ConfigFilename())
+ configFilenames = append(configFilenames, tc.ConfigFilenames()...)
}
// Merge from theme config into v1 based on configured
@@ -406,6 +412,7 @@ func (l configLoader) collectModules(modConfig modules.Config, v1 config.Provide
HookBeforeFinalize: hook,
WorkingDir: workingDir,
ThemesDir: themesDir,
+ Environment: l.Environment,
CacheDir: filecacheConfigs.CacheDirModules(),
ModuleConfig: modConfig,
IgnoreVendor: ignoreVendor,
@@ -468,106 +475,6 @@ func (l configLoader) loadConfig(configName string) (string, error) {
return filename, nil
}
-func (l configLoader) loadConfigFromConfigDir() ([]string, error) {
- sourceFs := l.Fs
- configDir := l.AbsConfigDir
-
- if _, err := sourceFs.Stat(configDir); err != nil {
- // Config dir does not exist.
- return nil, nil
- }
-
- defaultConfigDir := filepath.Join(configDir, "_default")
- environmentConfigDir := filepath.Join(configDir, l.Environment)
-
- var configDirs []string
- // Merge from least to most specific.
- for _, dir := range []string{defaultConfigDir, environmentConfigDir} {
- if _, err := sourceFs.Stat(dir); err == nil {
- configDirs = append(configDirs, dir)
- }
- }
-
- if len(configDirs) == 0 {
- return nil, nil
- }
-
- // Keep track of these so we can watch them for changes.
- var dirnames []string
-
- for _, configDir := range configDirs {
- err := afero.Walk(sourceFs, configDir, func(path string, fi os.FileInfo, err error) error {
- if fi == nil || err != nil {
- return nil
- }
-
- if fi.IsDir() {
- dirnames = append(dirnames, path)
- return nil
- }
-
- if !config.IsValidConfigFilename(path) {
- return nil
- }
-
- name := cpaths.Filename(filepath.Base(path))
-
- item, err := metadecoders.Default.UnmarshalFileToMap(sourceFs, path)
- if err != nil {
- return l.wrapFileError(err, path)
- }
-
- var keyPath []string
-
- if name != "config" {
- // Can be params.jp, menus.en etc.
- name, lang := cpaths.FileAndExtNoDelimiter(name)
-
- keyPath = []string{name}
-
- if lang != "" {
- keyPath = []string{"languages", lang}
- switch name {
- case "menu", "menus":
- keyPath = append(keyPath, "menus")
- case "params":
- keyPath = append(keyPath, "params")
- }
- }
- }
-
- root := item
- if len(keyPath) > 0 {
- root = make(map[string]interface{})
- m := root
- for i, key := range keyPath {
- if i >= len(keyPath)-1 {
- m[key] = item
- } else {
- nm := make(map[string]interface{})
- m[key] = nm
- m = nm
- }
- }
- }
-
- // Migrate menu => menus etc.
- config.RenameKeys(root)
-
- // Set will overwrite keys with the same name, recursively.
- l.cfg.Set("", root)
-
- return nil
- })
- if err != nil {
- return nil, err
- }
-
- }
-
- return dirnames, nil
-}
-
func (l configLoader) loadLanguageSettings(oldLangs langs.Languages) error {
_, err := langs.LoadLanguageSettings(l.cfg, oldLangs)
return err
diff --git a/hugolib/config_test.go b/hugolib/config_test.go
index 77ac9b92f..65cb246b9 100644
--- a/hugolib/config_test.go
+++ b/hugolib/config_test.go
@@ -318,6 +318,59 @@ name = "menu-theme"
}
+func TestLoadConfigFromThemeDir(t *testing.T) {
+ t.Parallel()
+
+ mainConfig := `
+theme = "test-theme"
+
+[params]
+m1 = "mv1"
+`
+
+ themeConfig := `
+[params]
+t1 = "tv1"
+t2 = "tv2"
+`
+
+ themeConfigDir := filepath.Join("themes", "test-theme", "config")
+ themeConfigDirDefault := filepath.Join(themeConfigDir, "_default")
+ themeConfigDirProduction := filepath.Join(themeConfigDir, "production")
+
+ projectConfigDir := "config"
+
+ b := newTestSitesBuilder(t)
+ b.WithConfigFile("toml", mainConfig).WithThemeConfigFile("toml", themeConfig)
+ b.Assert(b.Fs.Source.MkdirAll(themeConfigDirDefault, 0777), qt.IsNil)
+ b.Assert(b.Fs.Source.MkdirAll(themeConfigDirProduction, 0777), qt.IsNil)
+ b.Assert(b.Fs.Source.MkdirAll(projectConfigDir, 0777), qt.IsNil)
+
+ b.WithSourceFile(filepath.Join(projectConfigDir, "config.toml"), `[params]
+m2 = "mv2"
+`)
+ b.WithSourceFile(filepath.Join(themeConfigDirDefault, "config.toml"), `[params]
+t2 = "tv2d"
+t3 = "tv3d"
+`)
+
+ b.WithSourceFile(filepath.Join(themeConfigDirProduction, "config.toml"), `[params]
+t3 = "tv3p"
+`)
+
+ b.Build(BuildCfg{})
+
+ got := b.Cfg.Get("params").(maps.Params)
+
+ b.Assert(got, qt.DeepEquals, maps.Params{
+ "t3": "tv3p",
+ "m1": "mv1",
+ "t1": "tv1",
+ "t2": "tv2d",
+ })
+
+}
+
func TestPrivacyConfig(t *testing.T) {
t.Parallel()