hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 3d1a6e109ce9b25fc2e9731098a82fb4c0abff68
parent b6798ee8676c48f86b0bd8581ea244f4be4ef3fa
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Sun, 18 Mar 2018 10:32:29 +0100

hugolib: Add ConfigSourceDescriptor

To prepare for config in themes

See #4490

Diffstat:
Mcommands/hugo.go | 2+-
Mhugolib/case_insensitive_test.go | 4++--
Mhugolib/config.go | 43+++++++++++++++++++++++++++++++------------
Mhugolib/config_test.go | 4++--
Mhugolib/disableKinds_test.go | 2+-
Mhugolib/testhelpers_test.go | 4++--
6 files changed, 39 insertions(+), 20 deletions(-)
diff --git a/commands/hugo.go b/commands/hugo.go
@@ -306,7 +306,7 @@ func InitializeConfig(running bool, doWithCommandeer func(c *commandeer) error, 
 	// Init file systems. This may be changed at a later point.
 	osFs := hugofs.Os
 
-	config, err := hugolib.LoadConfig(osFs, source, cfgFile)
+	config, err := hugolib.LoadConfig(hugolib.ConfigSourceDescriptor{Fs: osFs, Src: source, Name: cfgFile})
 	if err != nil {
 		return nil, err
 	}
diff --git a/hugolib/case_insensitive_test.go b/hugolib/case_insensitive_test.go
@@ -149,7 +149,7 @@ func TestCaseInsensitiveConfigurationVariations(t *testing.T) {
 
 	caseMixingTestsWriteCommonSources(t, mm)
 
-	cfg, err := LoadConfig(mm, "", "config.toml")
+	cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: mm})
 	require.NoError(t, err)
 
 	fs := hugofs.NewFrom(mm, cfg)
@@ -260,7 +260,7 @@ func doTestCaseInsensitiveConfigurationForTemplateEngine(t *testing.T, suffix st
 
 	caseMixingTestsWriteCommonSources(t, mm)
 
-	cfg, err := LoadConfig(mm, "", "config.toml")
+	cfg, err := LoadConfigDefault(mm)
 	require.NoError(t, err)
 
 	fs := hugofs.NewFrom(mm, cfg)
diff --git a/hugolib/config.go b/hugolib/config.go
@@ -26,24 +26,43 @@ import (
 	"github.com/spf13/viper"
 )
 
+// ConfigSourceDescriptor describes where to find the config (e.g. config.toml etc.).
+type ConfigSourceDescriptor struct {
+	Fs   afero.Fs
+	Src  string
+	Name string
+}
+
+func (d ConfigSourceDescriptor) configFilenames() []string {
+	return strings.Split(d.Name, ",")
+}
+
+// LoadConfigDefault is a convenience method to load the default "config.toml" config.
+func LoadConfigDefault(fs afero.Fs) (*viper.Viper, error) {
+	return LoadConfig(ConfigSourceDescriptor{Fs: fs, Name: "config.toml"})
+}
+
 // LoadConfig loads Hugo configuration into a new Viper and then adds
 // a set of defaults.
-func LoadConfig(fs afero.Fs, relativeSourcePath, configFilename string) (*viper.Viper, error) {
+func LoadConfig(d ConfigSourceDescriptor) (*viper.Viper, error) {
+	fs := d.Fs
 	v := viper.New()
 	v.SetFs(fs)
-	if relativeSourcePath == "" {
-		relativeSourcePath = "."
+
+	if d.Name == "" {
+		d.Name = "config.toml"
+	}
+
+	if d.Src == "" {
+		d.Src = "."
 	}
-	configFilenames := strings.Split(configFilename, ",")
+
+	configFilenames := d.configFilenames()
 	v.AutomaticEnv()
 	v.SetEnvPrefix("hugo")
 	v.SetConfigFile(configFilenames[0])
-	// See https://github.com/spf13/viper/issues/73#issuecomment-126970794
-	if relativeSourcePath == "" {
-		v.AddConfigPath(".")
-	} else {
-		v.AddConfigPath(relativeSourcePath)
-	}
+	v.AddConfigPath(d.Src)
+
 	err := v.ReadInConfig()
 	if err != nil {
 		if _, ok := err.(viper.ConfigParseError); ok {
@@ -62,8 +81,6 @@ func LoadConfig(fs afero.Fs, relativeSourcePath, configFilename string) (*viper.
 		}
 	}
 
-	v.RegisterAlias("indexes", "taxonomies")
-
 	if err := loadDefaultSettingsFor(v); err != nil {
 		return v, err
 	}
@@ -191,6 +208,8 @@ func loadDefaultSettingsFor(v *viper.Viper) error {
 		return err
 	}
 
+	v.RegisterAlias("indexes", "taxonomies")
+
 	v.SetDefault("cleanDestinationDir", false)
 	v.SetDefault("watch", false)
 	v.SetDefault("metaDataFormat", "toml")
diff --git a/hugolib/config_test.go b/hugolib/config_test.go
@@ -34,7 +34,7 @@ func TestLoadConfig(t *testing.T) {
 
 	writeToFs(t, mm, "hugo.toml", configContent)
 
-	cfg, err := LoadConfig(mm, "", "hugo.toml")
+	cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Name: "hugo.toml"})
 	require.NoError(t, err)
 
 	assert.Equal(t, "side", cfg.GetString("paginatePath"))
@@ -59,7 +59,7 @@ func TestLoadMultiConfig(t *testing.T) {
 
 	writeToFs(t, mm, "override.toml", configContentSub)
 
-	cfg, err := LoadConfig(mm, "", "base.toml,override.toml")
+	cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: mm, Name: "base.toml,override.toml"})
 	require.NoError(t, err)
 
 	assert.Equal(t, "top", cfg.GetString("paginatePath"))
diff --git a/hugolib/disableKinds_test.go b/hugolib/disableKinds_test.go
@@ -90,7 +90,7 @@ categories:
 	siteConfig := fmt.Sprintf(siteConfigTemplate, disabledStr)
 	writeToFs(t, mf, "config.toml", siteConfig)
 
-	cfg, err := LoadConfig(mf, "", "config.toml")
+	cfg, err := LoadConfigDefault(mf)
 	require.NoError(t, err)
 
 	fs := hugofs.NewFrom(mf, cfg)
diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go
@@ -229,7 +229,7 @@ func (s *sitesBuilder) CreateSites() *sitesBuilder {
 	s.writeFilePairs("i18n", s.i18nFilePairsAdded)
 
 	if s.Cfg == nil {
-		cfg, err := LoadConfig(s.Fs.Source, "", "config."+s.configFormat)
+		cfg, err := LoadConfig(ConfigSourceDescriptor{Fs: s.Fs.Source, Name: "config." + s.configFormat})
 		if err != nil {
 			s.Fatalf("Failed to load config: %s", err)
 		}
@@ -460,7 +460,7 @@ func newTestSitesFromConfig(t testing.TB, afs afero.Fs, tomlConfig string, layou
 
 	writeToFs(t, afs, "config.toml", tomlConfig)
 
-	cfg, err := LoadConfig(afs, "", "config.toml")
+	cfg, err := LoadConfigDefault(afs)
 	require.NoError(t, err)
 
 	fs := hugofs.NewFrom(afs, cfg)