forked from ellipsis/ellipsis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.bash
146 lines (129 loc) · 3.38 KB
/
utils.bash
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
# utils.bash
#
# Utility functions used by ellipsis.
# check if a command or function exists
utils.cmd_exists() {
hash "$1" &> /dev/null
}
# Check for interactive tty
utils.is_interactive() {
if [ ! -t 1 ]; then
return 1
fi
return 0
}
# prompt with message and return true if yes/YES, otherwise false
# If a default is provided, there will be no prompt in a non interactive terminal
utils.prompt() {
local prompt="$1"
local default="$2"
if utils.is_interactive || utils.is_true "$ELLIPSIS_FORCE_PROMPT"; then
read -r -p "$prompt " answer
fi
# Use default if answer is empty or tty is non interactive
if [ -z "$answer" ]; then
answer="$default"
fi
if ! utils.is_true "$answer"; then
return 1
fi
return 0
}
# Run web-based installers
utils.run_installer() {
local url="${url:-$1}"
# save reference to current dir
local cwd="$(pwd)"
# create temp dir and cd to it
local tmp_dir="$(mktemp -d "$TMPDIR.XXXXXX")" && cd "$tmp_dir"
# download installer
curl -sL "$url" > "tmp-$$.sh"
# run with ELLIPSIS env var set
ELLIPSIS=1 sh "tmp-$$.sh"
# change back to original dir and clean up
cd "$cwd"
rm -rf "$tmp_dir"
}
utils.strip_colors() {
echo "$@" | sed -e 's/\[[^m]*m//g'
}
# Compare version strings
#
# Usage:
# utils.version_compare "1.2-Alpha" "lt" "1.4"
#
# Operants: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, ne
# Return: false or true based on result
utils.version_compare() {
# Strip everything behind a dash (eg. 1.2.0-rc1 -> 1.2.0)
local v1="${1%%-*}"
local v2="${3%%-*}"
# Split version numbers into array
v1=(${v1//./ })
v2=(${v2//./ })
# Initialize loop operants and return code
case "$2" in
\<|lt|-lt)
local op_success="-lt"
local op_fail="-gt"
local equal_return=1
;;
\<=|le|-le)
local op_success="-lt"
local op_fail="-gt"
local equal_return=0
;;
\>|gt|-gt)
local op_success="-gt"
local op_fail="-lt"
local equal_return=1
;;
\>=|ge|-ge)
local op_success="-gt"
local op_fail="-lt"
local equal_return=0
;;
==|=|eq|-eq)
local op_success=""
local op_fail="-ne"
local equal_return=0
;;
!=|ne|-ne)
local op_success="-ne"
local op_fail=""
local equal_return=1
;;
esac
# Compare all parts of the version string
for index in ${!v1[*]}; do
# Check if equal
if [ "${v1[$index]}" -eq "${v2[$index]}" ]; then
continue
fi
# Check for fail if possible
if [ -n "$op_fail" ]; then
if [ "${v1[$index]}" $op_fail "${v2[$index]}" ]; then
return 1
fi
fi
# Check for success if possible
if [ -n "$op_success" ]; then
if [ "${v1[$index]}" $op_success "${v2[$index]}" ]; then
return 0
fi
fi
done
return $equal_return
}
# Check if an option is set to true (or 1) in a safe manner
utils.is_true() {
local var="$1"
case $var in
true|True|TRUE|yes|Yes|YES|y|Y|1)
return 0
;;
*)
return 1
;;
esac
}