diff options
author | Bjørn Erik Pedersen <[email protected]> | 2021-06-16 19:11:01 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2021-06-18 12:54:30 +0200 |
commit | bb2aa08709c812a5be29922a1a7f4d814e200cab (patch) | |
tree | a709117fe1a882b0179e41db0d72b103f53a4f6a /config/configLoader.go | |
parent | 9096842b0494166e401cc08a70b93ae2ee19a198 (diff) | |
download | hugo-bb2aa08709c812a5be29922a1a7f4d814e200cab.tar.gz hugo-bb2aa08709c812a5be29922a1a7f4d814e200cab.zip |
Implement configuration in a directory for modules
Fixes #8654
Diffstat (limited to 'config/configLoader.go')
-rw-r--r-- | config/configLoader.go | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/config/configLoader.go b/config/configLoader.go index 0998b1bef..8dcfcbdcc 100644 --- a/config/configLoader.go +++ b/config/configLoader.go @@ -14,9 +14,14 @@ package config import ( + "os" "path/filepath" "strings" + "github.com/pkg/errors" + + "github.com/gohugoio/hugo/common/paths" + "github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/parser/metadecoders" "github.com/spf13/afero" @@ -84,6 +89,102 @@ func loadConfigFromFile(fs afero.Fs, filename string) (map[string]interface{}, e return m, nil } +func LoadConfigFromDir(sourceFs afero.Fs, configDir, environment string) (Provider, []string, error) { + defaultConfigDir := filepath.Join(configDir, "_default") + environmentConfigDir := filepath.Join(configDir, environment) + cfg := New() + + 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, 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 !IsValidConfigFilename(path) { + return nil + } + + name := paths.Filename(filepath.Base(path)) + + item, err := metadecoders.Default.UnmarshalFileToMap(sourceFs, path) + if err != nil { + // This will be used in error reporting, use the most specific value. + dirnames = []string{path} + return errors.Wrapf(err, "failed to unmarshl config for path %q", path) + } + + var keyPath []string + + if name != "config" { + // Can be params.jp, menus.en etc. + name, lang := paths.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. + RenameKeys(root) + + // Set will overwrite keys with the same name, recursively. + cfg.Set("", root) + + return nil + }) + if err != nil { + return nil, dirnames, err + } + + } + + return cfg, dirnames, nil + +} + var keyAliases maps.KeyRenamer func init() { |