From 3ad3c5d489d426f874bb207731c0957aaa3b3361 Mon Sep 17 00:00:00 2001 From: Johan Gielstra Date: Fri, 26 May 2017 13:55:14 -0500 Subject: [PATCH 1/2] Added support for multiple config files via --config base.toml,other.toml,another.toml Use viper's MergeConfig() to merge changes go fmt update --- hugolib/config.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/hugolib/config.go b/hugolib/config.go index 8847b3495f9..7e52217ec9d 100644 --- a/hugolib/config.go +++ b/hugolib/config.go @@ -19,6 +19,9 @@ import ( "github.com/spf13/afero" "github.com/spf13/hugo/helpers" "github.com/spf13/viper" + "io" + "os" + "strings" ) // LoadConfig loads Hugo configuration into a new Viper and then adds @@ -29,10 +32,10 @@ func LoadConfig(fs afero.Fs, relativeSourcePath, configFilename string) (*viper. if relativeSourcePath == "" { relativeSourcePath = "." } - + configFilenames := strings.Split(configFilename, ",") v.AutomaticEnv() v.SetEnvPrefix("hugo") - v.SetConfigFile(configFilename) + v.SetConfigFile(configFilenames[0]) // See https://github.com/spf13/viper/issues/73#issuecomment-126970794 if relativeSourcePath == "" { v.AddConfigPath(".") @@ -46,6 +49,16 @@ func LoadConfig(fs afero.Fs, relativeSourcePath, configFilename string) (*viper. } return nil, fmt.Errorf("Unable to locate Config file. Perhaps you need to create a new site.\n Run `hugo help new` for details. (%s)\n", err) } + for _, configFile := range configFilenames[1:] { + var r io.Reader + var err error + if r, err = os.Open(configFile); err != nil { + return nil, fmt.Errorf("Unable to open Config file.\n (%s)\n", err) + } + if err = v.MergeConfig(r); err != nil { + return nil, fmt.Errorf("Unable to parse/merge Config file (%s).\n (%s)\n", configFile, err) + } + } v.RegisterAlias("indexes", "taxonomies") From 56c87c089544116369871367c01f5d6da103bf94 Mon Sep 17 00:00:00 2001 From: Johan Gielstra Date: Fri, 26 May 2017 15:47:35 -0500 Subject: [PATCH 2/2] Added test case, remove os.Open and used afero.Open --- hugolib/config.go | 3 +-- hugolib/config_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/hugolib/config.go b/hugolib/config.go index 7e52217ec9d..6d76a2b7155 100644 --- a/hugolib/config.go +++ b/hugolib/config.go @@ -20,7 +20,6 @@ import ( "github.com/spf13/hugo/helpers" "github.com/spf13/viper" "io" - "os" "strings" ) @@ -52,7 +51,7 @@ func LoadConfig(fs afero.Fs, relativeSourcePath, configFilename string) (*viper. for _, configFile := range configFilenames[1:] { var r io.Reader var err error - if r, err = os.Open(configFile); err != nil { + if r, err = fs.Open(configFile); err != nil { return nil, fmt.Errorf("Unable to open Config file.\n (%s)\n", err) } if err = v.MergeConfig(r); err != nil { diff --git a/hugolib/config_test.go b/hugolib/config_test.go index 780e5c33d3c..874416b9d0e 100644 --- a/hugolib/config_test.go +++ b/hugolib/config_test.go @@ -41,3 +41,27 @@ func TestLoadConfig(t *testing.T) { // default assert.Equal(t, "layouts", cfg.GetString("layoutDir")) } +func TestLoadMultiConfig(t *testing.T) { + t.Parallel() + + // Add a random config variable for testing. + // side = page in Norwegian. + configContentBase := ` + DontChange = "same" + PaginatePath = "side" + ` + configContentSub := ` + PaginatePath = "top" + ` + mm := afero.NewMemMapFs() + + writeToFs(t, mm, "base.toml", configContentBase) + + writeToFs(t, mm, "override.toml", configContentSub) + + cfg, err := LoadConfig(mm, "", "base.toml,override.toml") + require.NoError(t, err) + + assert.Equal(t, "top", cfg.GetString("paginatePath")) + assert.Equal(t, "same", cfg.GetString("DontChange")) +}