fix(kit/cli): fix loading config from directories with '.' in the name (#20702)

pull/20690/head
Daniel Moran 2021-02-05 10:56:12 -05:00 committed by GitHub
parent b01db56738
commit 1ad8f8d23d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 109 additions and 16 deletions

View File

@ -70,6 +70,7 @@ RPM packages, which has been left unchanged.
1. [20669](https://github.com/influxdata/influxdb/pull/20669): Remove blank lines from payloads sent by `influx write`.
1. [20657](https://github.com/influxdata/influxdb/pull/20657): Allow for creating users without initial passwords in `influx user create`.
1. [20679](https://github.com/influxdata/influxdb/pull/20679): Fix incorrect "bucket not found" errors when passing `--bucket-id` to `influx write`.
1. [20702](https://github.com/influxdata/influxdb/pull/20702): Fix loading config when `INFLUXD_CONFIG_PATH` points to a directory with `.` in its name.
## v2.0.3 [2020-12-14]

View File

@ -60,20 +60,6 @@ func NewCommand(v *viper.Viper, p *Program) *cobra.Command {
// This normalizes "-" to an underscore in env names.
v.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
if configPath := v.GetString("CONFIG_PATH"); configPath != "" {
switch strings.ToLower(path.Ext(configPath)) {
case ".json", ".toml", ".yaml", ".yml":
v.SetConfigFile(configPath)
case "":
v.AddConfigPath(configPath)
}
} else {
// defaults to looking in same directory as program running for
// a file with base `config` and extensions .json|.toml|.yaml|.yml
v.SetConfigName("config")
v.AddConfigPath(".")
}
// done before we bind flags to viper keys.
// order of precedence (1 highest -> 3 lowest):
// 1. flags
@ -88,8 +74,20 @@ func NewCommand(v *viper.Viper, p *Program) *cobra.Command {
}
func initializeConfig(v *viper.Viper) error {
err := v.ReadInConfig()
if err != nil && !os.IsNotExist(err) {
configPath := v.GetString("CONFIG_PATH")
if configPath == "" {
// Default to looking in the working directory of the running process.
configPath = "."
}
switch strings.ToLower(path.Ext(configPath)) {
case ".json", ".toml", ".yaml", ".yml":
v.SetConfigFile(configPath)
default:
v.AddConfigPath(configPath)
}
if err := v.ReadInConfig(); err != nil && !os.IsNotExist(err) {
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
return err
}

View File

@ -7,6 +7,7 @@ import (
"math"
"os"
"path"
"path/filepath"
"testing"
"time"
@ -420,3 +421,96 @@ func Test_ConfigPrecedence(t *testing.T) {
t.Run(tt.name, fn)
}
}
func Test_ConfigPathDotDirectory(t *testing.T) {
testDir, err := ioutil.TempDir("", "")
require.NoError(t, err)
defer os.RemoveAll(testDir)
tests := []struct {
name string
dir string
}{
{
name: "dot at start",
dir: ".directory",
},
{
name: "dot in middle",
dir: "config.d",
},
{
name: "dot at end",
dir: "forgotmyextension.",
},
}
config := map[string]string{
"foo": "bar",
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
configDir := filepath.Join(testDir, tc.dir)
require.NoError(t, os.Mkdir(configDir, 0700))
_, err = writeTomlConfig(configDir, config)
require.NoError(t, err)
defer setEnvVar("TEST_CONFIG_PATH", configDir)()
var foo string
program := &Program{
Name: "test",
Opts: []Opt{
{
DestP: &foo,
Flag: "foo",
},
},
Run: func() error { return nil },
}
cmd := NewCommand(viper.New(), program)
cmd.SetArgs([]string{})
require.NoError(t, cmd.Execute())
require.Equal(t, "bar", foo)
})
}
}
func Test_LoadConfigCwd(t *testing.T) {
testDir, err := ioutil.TempDir("", "")
require.NoError(t, err)
defer os.RemoveAll(testDir)
pwd, err := os.Getwd()
require.NoError(t, err)
defer os.Chdir(pwd)
require.NoError(t, os.Chdir(testDir))
config := map[string]string{
"foo": "bar",
}
_, err = writeJsonConfig(testDir, config)
require.NoError(t, err)
var foo string
program := &Program{
Name: "test",
Opts: []Opt{
{
DestP: &foo,
Flag: "foo",
},
},
Run: func() error { return nil },
}
cmd := NewCommand(viper.New(), program)
cmd.SetArgs([]string{})
require.NoError(t, cmd.Execute())
require.Equal(t, "bar", foo)
}