forked from codeskyblue/gosuv
-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathutils.go
More file actions
127 lines (112 loc) · 2.84 KB
/
utils.go
File metadata and controls
127 lines (112 loc) · 2.84 KB
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
package main
import (
"errors"
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"time"
//"os/exec"
log "github.com/cihub/seelog"
)
var ErrGoTimeout = errors.New("GoTimeoutFunc")
func GoFunc(f func() error) chan error {
ch := make(chan error)
go func() {
ch <- f()
}()
return ch
}
func GoTimeoutFunc(timeout time.Duration, f func() error) chan error {
ch := make(chan error)
go func() {
var err error
select {
case err = <-GoFunc(f):
ch <- err
case <-time.After(timeout):
log.Debugf("timeout: %v", f)
ch <- ErrGoTimeout
}
}()
return ch
}
func GoTimeout(f func() error, timeout time.Duration) (err error) {
done := make(chan bool)
go func() {
err = f()
done <- true
}()
select {
case <-time.After(timeout):
return ErrGoTimeout
case <-done:
return
}
}
func IsDir(dir string) bool {
fi, err := os.Stat(dir)
return err == nil && fi.IsDir()
}
func UserHomeDir() string {
if runtime.GOOS == "windows" {
home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
if home == "" {
home = os.Getenv("USERPROFILE")
}
return home
}
return os.Getenv("HOME")
}
// askForConfirmation uses Scanln to parse user input. A user must type in "yes" or "no" and
// then press enter. It has fuzzy matching, so "y", "Y", "yes", "YES", and "Yes" all count as
// confirmations. If the input is not recognized, it will ask again. The function does not return
// until it gets a valid response from the user. Typically, you should use fmt to print out a question
// before calling askForConfirmation. E.g. fmt.Println("WARNING: Are you sure? (yes/no)")
func askForConfirmation(prompt string, _default bool) bool {
var response string
fmt.Print(prompt)
_, err := fmt.Scanln(&response)
if err != nil {
return _default
}
okayResponses := []string{"y", "Y", "yes", "Yes", "YES"}
nokayResponses := []string{"n", "N", "no", "No", "NO"}
if containsString(okayResponses, response) {
return true
} else if containsString(nokayResponses, response) {
return false
} else {
return askForConfirmation(prompt, _default)
}
}
// You might want to put the following two functions in a separate utility package.
// posString returns the first index of element in slice.
// If slice does not contain element, returns -1.
func posString(slice []string, element string) int {
for index, elem := range slice {
if elem == element {
return index
}
}
return -1
}
// containsString returns true iff slice contains element
func containsString(slice []string, element string) bool {
return !(posString(slice, element) == -1)
}
func StringFormat(format string, m map[string]interface{}) string {
for k, v := range m {
format = strings.Replace(format, "{"+k+"}", fmt.Sprintf("%v", v), -1)
}
return format
}
func getCurrentPath() string {
pwd, _ := os.Getwd()
return pwd
}
func getExecPath() string {
ex, _ := os.Executable()
return filepath.Dir(ex)
}