Merge pull request #1019 from ktomk/fix-env-file

import environment variables that are present
This commit is contained in:
Vincent Demeester 2018-07-16 13:41:29 +02:00 committed by GitHub
commit 9e71207327
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 7 deletions

View File

@ -18,5 +18,5 @@ import (
// environment variables, that's why we just strip leading whitespace and // environment variables, that's why we just strip leading whitespace and
// nothing more. // nothing more.
func ParseEnvFile(filename string) ([]string, error) { func ParseEnvFile(filename string) ([]string, error) {
return parseKeyValueFile(filename, os.Getenv) return parseKeyValueFile(filename, os.LookupEnv)
} }

View File

@ -139,3 +139,40 @@ another invalid line`
t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error()) 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")
}
}

View File

@ -21,7 +21,7 @@ func (e ErrBadKey) Error() string {
return fmt.Sprintf("poorly formatted environment: %s", e.msg) 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) fh, err := os.Open(filename)
if err != nil { if err != nil {
return []string{}, err return []string{}, err
@ -53,17 +53,23 @@ func parseKeyValueFile(filename string, emptyFn func(string) string) ([]string,
if strings.ContainsAny(variable, whiteSpaces) { if strings.ContainsAny(variable, whiteSpaces) {
return []string{}, ErrBadKey{fmt.Sprintf("variable '%s' has white spaces", variable)} 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 { if len(data) > 1 {
// pass the value through, no trimming // pass the value through, no trimming
lines = append(lines, fmt.Sprintf("%s=%s", variable, data[1])) lines = append(lines, fmt.Sprintf("%s=%s", variable, data[1]))
} else { } else {
var value string var value string
var present bool
if emptyFn != nil { 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))
} }
} }
} }

View File

@ -19,10 +19,10 @@ func ReadKVStrings(files []string, override []string) ([]string, error) {
// present in the file with additional pairs specified in the override parameter. // 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. // If a key has no value, it will get the value from the environment.
func ReadKVEnvStrings(files []string, override []string) ([]string, error) { 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{} variables := []string{}
for _, ef := range files { for _, ef := range files {
parsedVars, err := parseKeyValueFile(ef, emptyFn) parsedVars, err := parseKeyValueFile(ef, emptyFn)