From 3d1a6e109ce9b25fc2e9731098a82fb4c0abff68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Sun, 18 Mar 2018 10:32:29 +0100 Subject: [PATCH] hugolib: Add ConfigSourceDescriptor To prepare for config in themes See #4490 --- commands/hugo.go | 2 +- hugolib/case_insensitive_test.go | 4 +-- hugolib/config.go | 43 +++++++++++++++++++++++--------- hugolib/config_test.go | 4 +-- hugolib/disableKinds_test.go | 2 +- hugolib/testhelpers_test.go | 4 +-- 6 files changed, 39 insertions(+), 20 deletions(-) diff --git a/commands/hugo.go b/commands/hugo.go index 60244b099..b041fad38 100644 --- 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 index ca63196b3..680a701aa 100644 --- 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 index 678ebf669..e47e65435 100644 --- 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" } - configFilenames := strings.Split(configFilename, ",") + + if d.Src == "" { + d.Src = "." + } + + 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 index 874416b9d..ec543d93d 100644 --- 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 index 736d461db..d689f9dcc 100644 --- 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 index b6394f6d8..ab23b343c 100644 --- 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)