-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathenv.go
113 lines (99 loc) · 1.87 KB
/
env.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package xos
import (
"fmt"
"os"
"path/filepath"
"strings"
"sync"
)
type Env struct {
environMu sync.RWMutex
environ []string
}
func NewEnv(environ []string) *Env {
return &Env{
environ: environ,
}
}
func (e *Env) Environ() []string {
e.environMu.RLock()
defer e.environMu.RUnlock()
environ2 := make([]string, 0, len(e.environ))
return append(environ2, e.environ...)
}
func (e *Env) Setenv(name, value string) {
e.environMu.Lock()
defer e.environMu.Unlock()
l := fmt.Sprintf("%s=%s", name, value)
for i, l2 := range e.environ {
j := strings.Index(l2, "=")
if j == -1 {
continue
}
name2 := l2[:j]
if name != name2 {
continue
}
e.environ[i] = l
return
}
e.environ = append(e.environ, l)
}
func (e *Env) Getenv(name string) string {
e.environMu.RLock()
defer e.environMu.RUnlock()
for _, l := range e.environ {
i := strings.Index(l, "=")
if i == -1 {
continue
}
name2 := l[:i]
if name == name2 {
return l[i+1:]
}
}
return ""
}
func (e *Env) Bool(name string) (*bool, error) {
ev := e.Getenv(name)
if ev == "" {
return nil, nil
}
eb := new(bool)
if ev == "0" || ev == "false" {
return eb, nil
}
if ev == "1" || ev == "true" {
*eb = true
return eb, nil
}
return nil, fmt.Errorf("$%s must be 0, 1, false or true but got %q", name, ev)
}
func (e *Env) HumanPath(fp string) string {
if strings.HasPrefix(fp, e.Getenv("HOME")) {
return filepath.Join("~", strings.TrimPrefix(fp, e.Getenv("HOME")))
}
return fp
}
func (e *Env) Debug() bool {
debug, err := e.Bool("DEBUG")
if err != nil {
os.Stderr.WriteString(fmt.Sprintf("env: %v", err))
return false
}
if debug == nil || !*debug {
return false
}
return true
}
func (e *Env) CI() bool {
ci, err := e.Bool("CI")
if err != nil {
os.Stderr.WriteString(fmt.Sprintf("env: %v", err))
return false
}
if ci == nil || !*ci {
return false
}
return true
}