github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/uniter/runner/env.go (about) 1 // Copyright 2012-2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package runner 5 6 import ( 7 "strings" 8 ) 9 10 // mergeEnvironment takes in a string array representing the desired environment 11 // and merges it with the current environment. On Windows, clearing the environment, 12 // or having missing environment variables, may lead to standard go packages not working 13 // (os.TempDir relies on $env:TEMP), and powershell erroring out 14 // TODO(fwereade, gsamfira): this is copy/pasted from utils/exec. 15 // This is only used on windows, so it is safe to do in a case insensitive way. 16 func mergeWindowsEnvironment(newEnv, env []string) []string { 17 if len(newEnv) == 0 { 18 return env 19 } 20 21 // this whole rigamarole is so that we retain the case of existing 22 // environment variables, while being case insensitive about overwriting 23 // their values. 24 25 orig := make(map[string]string, len(env)) 26 uppers := make(map[string]string, len(env)) 27 news := map[string]string{} 28 29 tmpEnv := make([]string, 0, len(env)) 30 for _, val := range env { 31 varSplit := strings.SplitN(val, "=", 2) 32 k := varSplit[0] 33 uppers[strings.ToUpper(k)] = varSplit[1] 34 orig[k] = varSplit[1] 35 } 36 37 for _, val := range newEnv { 38 varSplit := strings.SplitN(val, "=", 2) 39 k := varSplit[0] 40 if _, ok := uppers[strings.ToUpper(k)]; ok { 41 uppers[strings.ToUpper(k)] = varSplit[1] 42 } else { 43 news[k] = varSplit[1] 44 } 45 } 46 47 for k, _ := range orig { 48 tmpEnv = append(tmpEnv, k+"="+uppers[strings.ToUpper(k)]) 49 } 50 51 for k, v := range news { 52 tmpEnv = append(tmpEnv, k+"="+v) 53 } 54 return tmpEnv 55 }