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  }