Merge pull request #459 from ChrisHines/parse-env
Handle additional edge cases when parsing environment variables.
This commit is contained in:
commit
ceeabe63f7
|
@ -44,17 +44,22 @@ func NewTaskEnivornment() TaskEnvironment {
|
|||
return make(map[string]string)
|
||||
}
|
||||
|
||||
// Parses a list of strings with NAME=value pairs and returns a TaskEnvironment.
|
||||
// ParseFromList parses a list of strings with NAME=value pairs and returns a
|
||||
// TaskEnvironment.
|
||||
func ParseFromList(envVars []string) (TaskEnvironment, error) {
|
||||
t := NewTaskEnivornment()
|
||||
|
||||
for _, pair := range envVars {
|
||||
parts := strings.Split(pair, "=")
|
||||
if len(parts) != 2 {
|
||||
// Start the search from the second byte to skip a possible leading
|
||||
// "=". Cmd.exe on Windows creates some special environment variables
|
||||
// that start with an "=" and they can be properly retrieved by OS
|
||||
// functions so we should handle them properly here.
|
||||
idx := strings.Index(pair[1:], "=")
|
||||
if idx == -1 {
|
||||
return nil, fmt.Errorf("Couldn't parse environment variable: %v", pair)
|
||||
}
|
||||
|
||||
t[parts[0]] = parts[1]
|
||||
idx++ // adjust for slice offset above
|
||||
t[pair[:idx]] = pair[idx+1:]
|
||||
}
|
||||
|
||||
return t, nil
|
||||
|
|
|
@ -22,26 +22,33 @@ func TestEnvironment_AsList(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestEnvironment_ParseFromList(t *testing.T) {
|
||||
input := []string{"foo=bar", "BAZ=baM"}
|
||||
input := []string{
|
||||
"foo=bar",
|
||||
"BAZ=baM",
|
||||
"bar=emb=edded", // This can be done in multiple OSes.
|
||||
"=ExitCode=00000000", // A Windows cmd.exe annoyance
|
||||
}
|
||||
env, err := ParseFromList(input)
|
||||
if err != nil {
|
||||
t.Fatalf("ParseFromList(%#v) failed: %v", input, err)
|
||||
}
|
||||
|
||||
exp := map[string]string{
|
||||
"foo": "bar",
|
||||
"BAZ": "baM",
|
||||
"foo": "bar",
|
||||
"BAZ": "baM",
|
||||
"bar": "emb=edded",
|
||||
"=ExitCode": "00000000",
|
||||
}
|
||||
|
||||
if len(env) != len(exp) {
|
||||
t.Fatalf("ParseFromList(%#v) has length %v; want %v", input, len(env), len(exp))
|
||||
t.Errorf("ParseFromList(%#v) has length %v; want %v", input, len(env), len(exp))
|
||||
}
|
||||
|
||||
for k, v := range exp {
|
||||
if actV, ok := env[k]; !ok {
|
||||
t.Fatalf("ParseFromList(%#v) doesn't contain expected %v", input, k)
|
||||
t.Errorf("ParseFromList(%#v) doesn't contain expected %v", input, k)
|
||||
} else if actV != v {
|
||||
t.Fatalf("ParseFromList(%#v) has incorrect value for %v; got %v; want %v", input, k, actV, v)
|
||||
t.Errorf("ParseFromList(%#v) has incorrect value for %v; got %v; want %v", input, k, actV, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue