diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2021-06-16 19:11:01 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2021-06-18 12:54:30 +0200 |
commit | bb2aa08709c812a5be29922a1a7f4d814e200cab (patch) | |
tree | a709117fe1a882b0179e41db0d72b103f53a4f6a /hugolib | |
parent | 9096842b0494166e401cc08a70b93ae2ee19a198 (diff) |
Implement configuration in a directory for modules
Fixes #8654
Diffstat (limited to 'hugolib')
-rw-r--r-- | hugolib/config.go | 115 | ||||
-rw-r--r-- | hugolib/config_test.go | 53 |
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() |