-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.go
131 lines (103 loc) · 2.34 KB
/
utils.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package main
import (
"bufio"
"bytes"
"fmt"
"io"
"os"
"os/user"
"path/filepath"
"strings"
)
type filenotfound struct {
name string
}
func (e *filenotfound) Error() string {
return "file not found: " + e.name
}
func loadFile(fp string) (*bytes.Buffer, error) {
tmplfile, err := filepath.Abs(fp)
if err != nil {
return nil, fmt.Errorf("unable to get path to file %q: %s", fp, err.Error())
}
f, err := os.Open(tmplfile)
if err != nil {
if os.IsNotExist(err) {
return nil, &filenotfound{name: tmplfile}
}
return nil, fmt.Errorf("unable to open file %q: %s", fp, err.Error())
}
defer f.Close()
var buf bytes.Buffer
if _, err := io.Copy(&buf, f); err != nil {
return nil, fmt.Errorf("unable to read file %q: %s", fp, err.Error())
}
return &buf, nil
}
func startswith(s, prefix string) bool {
return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
}
func expand(path string) (string, error) {
if !startswith(path, "~/") {
return path, nil
}
usr, err := user.Current()
if err != nil {
return path, err
}
return filepath.Join(usr.HomeDir, path[1:]), nil
}
func loadVirtualEnv(fp string) (map[string]string, error) {
if fp == "" {
return nil, nil
}
fp, err := expand(fp)
if err != nil {
return nil, fmt.Errorf("unable to expand %q in path: %s", "~", err.Error())
}
data, err := loadFile(fp)
if err != nil {
return nil, err
}
ev := make(map[string]string)
sc := bufio.NewScanner(data)
for sc.Scan() {
k, v := parseLine(sc.Text())
if k == "" || v == "" {
continue
}
ev[k] = v
}
return ev, nil
}
func parseLine(line string) (string, string) {
if startswith(strings.TrimSpace(line), "#") {
return "", ""
}
items := strings.Split(line, "=")
if len(items) < 2 {
return "", ""
}
return strings.ToUpper(items[0]), strings.Join(items[1:], "=")
}
func envOrDefault(key, defval string) string {
if v, found := os.LookupEnv(key); found {
if s := strings.TrimSpace(v); s != "" {
return s
}
}
return defval
}
func errexit(format string, args ...interface{}) {
fmt.Fprintf(os.Stderr, "[dotenv] "+format+"\n", args...)
os.Exit(1)
}
func envFilePresentInHome(filename string) (string, bool) {
filename = filepath.Join(dotenvLocations, filename+".env")
filename, _ = expand(filename)
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return "", false
}
return filename, !info.IsDir()
}