-
Notifications
You must be signed in to change notification settings - Fork 49
/
transform.go
76 lines (67 loc) 路 1.43 KB
/
transform.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package envars
import (
"os"
"strings"
)
// Transform encapsulates low-level transformations on an existing environment.
type Transform struct {
seed Envars
dest Envars
envRoot string
}
// Changed returns the set of changed Envars.
//
// If "undo" is true the returned Envars will include undo state.
func (t *Transform) Changed(undo bool) Envars {
if undo {
return t.dest.Clone()
}
out := make(Envars, len(t.dest))
for k, v := range t.dest {
if strings.HasPrefix(k, "_HERMIT_OLD_") || v == "" {
continue
}
out[k] = v
}
return out
}
// Combined returns a copy of the full set of original Envars with Changed applied.
//
// Deleted keys will be removed.
func (t *Transform) Combined() Envars {
out := t.seed.Clone()
t.To(out)
return out
}
// To applies the Transform to "env" in place.
func (t *Transform) To(env Envars) {
for k, v := range t.dest {
if v == "" {
delete(env, k)
} else {
env[k] = v
}
}
}
// get a value.
func (t *Transform) get(key string) (string, bool) {
if v, ok := t.dest[key]; ok {
return v, ok
}
v, ok := t.seed[key]
return v, ok
}
// Set a key, expanding any ${X} references in the value.
func (t *Transform) set(key, value string) {
t.dest[key] = t.expand(value)
}
// Unset a key.
func (t *Transform) unset(key string) {
t.dest[key] = ""
}
func (t *Transform) expand(value string) string {
return os.Expand(value, func(s string) string {
v, _ := t.get(s)
return v
})
}