aboutsummaryrefslogtreecommitdiffhomepage
path: root/config/configLoader.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <[email protected]>2021-06-16 19:11:01 +0200
committerBjørn Erik Pedersen <[email protected]>2021-06-18 12:54:30 +0200
commitbb2aa08709c812a5be29922a1a7f4d814e200cab (patch)
treea709117fe1a882b0179e41db0d72b103f53a4f6a /config/configLoader.go
parent9096842b0494166e401cc08a70b93ae2ee19a198 (diff)
downloadhugo-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.go101
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() {