Permalink
Browse files

Ignore unknown config files in config dir

Swap files etc.

Fixes #5646
  • Loading branch information...
bep committed Feb 1, 2019
1 parent d9282cf commit 3244cb3b31f8f8c39d9dfa82bc01fb2d6db59257
Showing with 59 additions and 2 deletions.
  1. +18 −1 config/configLoader.go
  2. +34 −0 config/configLoader_test.go
  3. +4 −0 hugolib/config.go
  4. +3 −1 hugolib/configdir_test.go
@@ -14,16 +14,33 @@
package config

import (
"path/filepath"
"strings"

"github.com/gohugoio/hugo/common/maps"
"github.com/gohugoio/hugo/parser/metadecoders"
"github.com/spf13/afero"
"github.com/spf13/viper"
)

var (
ValidConfigFileExtensions = []string{"toml", "yaml", "yml", "json"}
ValidConfigFileExtensions = []string{"toml", "yaml", "yml", "json"}
validConfigFileExtensionsMap map[string]bool = make(map[string]bool)
)

func init() {
for _, ext := range ValidConfigFileExtensions {
validConfigFileExtensionsMap[ext] = true
}
}

// IsValidConfigFilename returns whether filename is one of the supported
// config formats in Hugo.
func IsValidConfigFilename(filename string) bool {
ext := strings.ToLower(strings.TrimPrefix(filepath.Ext(filename), "."))
return validConfigFileExtensionsMap[ext]
}

// FromConfigString creates a config from the given YAML, JSON or TOML config. This is useful in tests.
func FromConfigString(config, configType string) (Provider, error) {
v := newViper()
@@ -0,0 +1,34 @@
// Copyright 2019 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package config

import (
"strings"
"testing"

"github.com/stretchr/testify/require"
)

func TestIsValidConfigFileName(t *testing.T) {
assert := require.New(t)

for _, ext := range ValidConfigFileExtensions {
filename := "config." + ext
assert.True(IsValidConfigFilename(filename), ext)
assert.True(IsValidConfigFilename(strings.ToUpper(filename)))
}

assert.False(IsValidConfigFilename(""))
assert.False(IsValidConfigFilename("config.toml.swp"))
}
@@ -283,6 +283,10 @@ func (l configLoader) loadConfigFromConfigDir(v *viper.Viper) ([]string, error)
return nil
}

if !config.IsValidConfigFilename(path) {
return nil
}

name := helpers.Filename(filepath.Base(path))

item, err := metadecoders.Default.UnmarshalFileToMap(sourceFs, path)
@@ -97,7 +97,9 @@ p3 = "p3params_no_production"
fb = fb.WithWorkingDir("config/development")

// This is set in all the config.toml variants above, but this will win.
fb.Add("config.toml", `paginatePath = "pag_development"`)
fb.Add("config.TOML", `paginatePath = "pag_development"`)
// Issue #5646
fb.Add("config.toml.swp", `p3 = "paginatePath = "nono"`)

fb.Add("params.no.toml", `p3 = "p3params_no_development"`)
fb.Add("params.toml", `p3 = "p3params_development"`)

0 comments on commit 3244cb3

Please sign in to comment.