~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/worker/uniter/runner/env.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}