Skip to content

Commit

Permalink
Merge pull request #1019 from ktomk/fix-env-file
Browse files Browse the repository at this point in the history
import environment variables that are present
  • Loading branch information
Vincent Demeester authored Jul 16, 2018
2 parents 7b82276 + b91fd12 commit 9e71207
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 7 deletions.
2 changes: 1 addition & 1 deletion opts/envfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@ import (
// environment variables, that's why we just strip leading whitespace and
// nothing more.
func ParseEnvFile(filename string) ([]string, error) {
return parseKeyValueFile(filename, os.Getenv)
return parseKeyValueFile(filename, os.LookupEnv)
}
37 changes: 37 additions & 0 deletions opts/envfile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,40 @@ another invalid line`
t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error())
}
}

// ParseEnvFile with environment variable import definitions
func TestParseEnvVariableDefinitionsFile(t *testing.T) {
content := `# comment=
UNDEFINED_VAR
HOME
`
tmpFile := tmpFileWithContent(content, t)
defer os.Remove(tmpFile)

variables, err := ParseEnvFile(tmpFile)
if nil != err {
t.Fatal("There must not be any error")
}

if "HOME="+os.Getenv("HOME") != variables[0] {
t.Fatal("the HOME variable is not properly imported as the first variable (but it is the only one to import)")
}

if 1 != len(variables) {
t.Fatal("exactly one variable is imported (as the other one is not set at all)")
}
}

// ParseEnvFile with empty variable name
func TestParseEnvVariableWithNoNameFile(t *testing.T) {
content := `# comment=
=blank variable names are an error case
`
tmpFile := tmpFileWithContent(content, t)
defer os.Remove(tmpFile)

_, err := ParseEnvFile(tmpFile)
if nil == err {
t.Fatal("if a variable has no name parsing an environment file must fail")
}
}
14 changes: 10 additions & 4 deletions opts/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (e ErrBadKey) Error() string {
return fmt.Sprintf("poorly formatted environment: %s", e.msg)
}

func parseKeyValueFile(filename string, emptyFn func(string) string) ([]string, error) {
func parseKeyValueFile(filename string, emptyFn func(string) (string, bool)) ([]string, error) {
fh, err := os.Open(filename)
if err != nil {
return []string{}, err
Expand Down Expand Up @@ -53,17 +53,23 @@ func parseKeyValueFile(filename string, emptyFn func(string) string) ([]string,
if strings.ContainsAny(variable, whiteSpaces) {
return []string{}, ErrBadKey{fmt.Sprintf("variable '%s' has white spaces", variable)}
}
if len(variable) == 0 {
return []string{}, ErrBadKey{fmt.Sprintf("no variable name on line '%s'", line)}
}

if len(data) > 1 {
// pass the value through, no trimming
lines = append(lines, fmt.Sprintf("%s=%s", variable, data[1]))
} else {
var value string
var present bool
if emptyFn != nil {
value = emptyFn(line)
value, present = emptyFn(line)
}
if present {
// if only a pass-through variable is given, clean it up.
lines = append(lines, fmt.Sprintf("%s=%s", strings.TrimSpace(line), value))
}
// if only a pass-through variable is given, clean it up.
lines = append(lines, fmt.Sprintf("%s=%s", strings.TrimSpace(line), value))
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions opts/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ func ReadKVStrings(files []string, override []string) ([]string, error) {
// present in the file with additional pairs specified in the override parameter.
// If a key has no value, it will get the value from the environment.
func ReadKVEnvStrings(files []string, override []string) ([]string, error) {
return readKVStrings(files, override, os.Getenv)
return readKVStrings(files, override, os.LookupEnv)
}

func readKVStrings(files []string, override []string, emptyFn func(string) string) ([]string, error) {
func readKVStrings(files []string, override []string, emptyFn func(string) (string, bool)) ([]string, error) {
variables := []string{}
for _, ef := range files {
parsedVars, err := parseKeyValueFile(ef, emptyFn)
Expand Down

0 comments on commit 9e71207

Please sign in to comment.