forked from xyproto/orbiton
-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.go
169 lines (153 loc) · 3.88 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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package main
import (
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
"unicode"
)
// exists checks if the given path exists
func exists(path string) bool {
_, err := os.Stat(path)
return err == nil
}
// which tries to find the given executable name in the $PATH
// Returns an empty string if not found.
func which(executable string) string {
p, err := exec.LookPath(executable)
if err != nil {
return ""
}
return p
}
// hasE checks if the given environment variable is set
func hasE(envVar string) bool {
return os.Getenv(envVar) != ""
}
// expandUser replaces a leading ~ or $HOME with the path
// to the home directory of the current user
func expandUser(path string) string {
// this is a simpler (and Linux/UNIX only) alternative to using os.UserHomeDir (which requires Go 1.12 or later)
if strings.HasPrefix(path, "~") {
path = strings.Replace(path, "~", os.Getenv("HOME"), 1)
} else if strings.HasPrefix(path, "$HOME") {
path = strings.Replace(path, "$HOME", os.Getenv("HOME"), 1)
}
return path
}
// hasAnyPrefixWord checks if the given line is prefixed with any one of the given words
func hasAnyPrefixWord(line string, wordList []string) bool {
for _, word := range wordList {
if strings.HasPrefix(line, word+" ") {
return true
}
}
return false
}
// hasS checks if the given string slice contains the given string
func hasS(sl []string, s string) bool {
for _, e := range sl {
if e == s {
return true
}
}
return false
}
// filterS returns all strings that makes the function f return true
func filterS(sl []string, f func(string) bool) []string {
var results []string
for _, e := range sl {
if f(e) {
results = append(results, e)
}
}
return results
}
// equalStringSlices checks if two given string slices are equal or not
// returns true if they are equal
func equalStringSlices(a, b []string) bool {
lena := len(a)
lenb := len(b)
if lena != lenb {
return false
}
for i := 0; i < lena; i++ {
if a[i] != b[i] {
return false
}
}
return true
}
// isLower checks if all letters in a string are lowercase
// thanks: https://stackoverflow.com/a/59293875/131264
func isLower(s string) bool {
for _, r := range s {
if unicode.IsLetter(r) && !unicode.IsLower(r) {
return false
}
}
return true
}
// Check if the given string only consists of the given rune,
// ignoring the other given runes.
func consistsOf(s string, e rune, ignore []rune) bool {
OUTER_LOOP:
for _, r := range s {
for _, x := range ignore {
if r == x {
continue OUTER_LOOP
}
}
if r != e {
//logf("CONSISTS OF: %s, %s, %s: FALSE\n", s, string(e), string(ignore))
return false
}
}
//logf("CONSISTS OF: %s, %s, %s: TRUE\n", s, string(e), string(ignore))
return true
}
// aBinDirectory will check if the given filename is in one of these directories:
// /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, ~/.bin, ~/bin, ~/.local/bin
func aBinDirectory(filename string) bool {
p, err := filepath.Abs(filepath.Dir(filename))
if err != nil {
return false
}
home := os.Getenv("HOME")
if len(home) == 0 {
username := os.Getenv("LOGNAME")
if len(username) == 0 {
return false
}
home = "/home/" + username
}
switch p {
case "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin":
return true
case filepath.Join(home, ".bin"), filepath.Join(home, "bin"), filepath.Join("local/bin"):
return true
}
return false
}
// logf, for quick "printf-style" debugging
func logf(format string, args ...interface{}) {
tmpdir := os.Getenv("TMPDIR")
if tmpdir == "" {
tmpdir = "/tmp"
}
logfilename := filepath.Join(tmpdir, "o.log")
f, err := os.OpenFile(logfilename, os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
f, err = os.Create(logfilename)
if err != nil {
log.Fatalln(err)
}
}
f.WriteString(fmt.Sprintf(format, args...))
f.Sync()
f.Close()
}
// Silence the "logf is unused" message by staticcheck
var _ = logf