Skip to content

Commit

Permalink
Add support for multiple config files via --config a.toml,b.toml,c.toml
Browse files Browse the repository at this point in the history
  • Loading branch information
jgielstra authored and bep committed Aug 9, 2017
1 parent c8257f8 commit 0f9f73c
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
16 changes: 14 additions & 2 deletions hugolib/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import (
"github.com/gohugoio/hugo/helpers"
"github.com/spf13/afero"
"github.com/spf13/viper"
"io"
"strings"
)

// LoadConfig loads Hugo configuration into a new Viper and then adds
Expand All @@ -29,10 +31,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(".")
Expand All @@ -46,6 +48,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 = 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 {
return nil, fmt.Errorf("Unable to parse/merge Config file (%s).\n (%s)\n", configFile, err)
}
}

v.RegisterAlias("indexes", "taxonomies")

Expand Down
24 changes: 24 additions & 0 deletions hugolib/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
}

0 comments on commit 0f9f73c

Please sign in to comment.