-
-
Notifications
You must be signed in to change notification settings - Fork 84
/
approvals.bash
125 lines (106 loc) · 2.49 KB
/
approvals.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
# approvals.bash v0.4.0
#
# Interactive approval testing for Bash.
# https://github.com/DannyBen/approvals.bash
approve() {
local expected approval approval_file actual cmd
approvals_dir=${APPROVALS_DIR:=approvals}
cmd=$1
last_exit_code=0
actual=$(eval "$cmd" 2>&1) || last_exit_code=$?
if [[ "$allow_diff_regex" ]]; then
actual=$(echo "$actual" | sed "s/$allow_diff_regex/*/g")
unset allow_diff_regex
fi
approval=$(printf "%b" "$cmd" | tr -s -c "[:alnum:]" _)
approval_file="$approvals_dir/${2:-"$approval"}"
[[ -d "$approvals_dir" ]] || mkdir "$approvals_dir"
if [[ -f "$approval_file" ]]; then
expected=$(cat "$approval_file")
else
echo "--- [$(blue "new: $cmd")] ---"
printf "%b\n" "$actual"
echo "--- [$(blue "new: $cmd")] ---"
expected="$actual"
user_approval "$cmd" "$actual" "$approval_file"
return
fi
if [[ "$(printf "%b" "$actual")" = "$(printf "%b" "$expected")" ]]; then
pass "$cmd"
else
echo "--- [$(blue "diff: $cmd")] ---"
$diff_cmd <(printf "%b" "$expected\n") <(printf "%b" "$actual\n") | tail -n +4
echo "--- [$(blue "diff: $cmd")] ---"
user_approval "$cmd" "$actual" "$approval_file"
fi
}
allow_diff() {
allow_diff_regex="$1"
}
describe() {
echo
blue "= $*"
}
context() {
echo
magenta "= $*"
}
fail() {
red " FAILED: $*"
exit 1
}
pass() {
green " approved: $*"
return 0
}
expect_exit_code() {
if [[ $last_exit_code == "$1" ]]; then
pass "exit $last_exit_code"
else
fail "Expected exit code $1, got $last_exit_code"
fi
}
red() { printf "\e[31m%b\e[0m\n" "$*"; }
green() { printf "\e[32m%b\e[0m\n" "$*"; }
blue() { printf "\e[34m%b\e[0m\n" "$*"; }
magenta() { printf "\e[35m%b\e[0m\n" "$*"; }
cyan() { printf "\e[36m%b\e[0m\n" "$*"; }
# Private
user_approval() {
local cmd="$1"
local actual="$2"
local approval_file="$3"
if [[ -v CI || -v GITHUB_ACTIONS ]]; then
fail "$cmd"
fi
echo
printf "[A]pprove? \n"
response=$(bash -c "read -n 1 key; echo \$key")
printf "\r"
if [[ $response =~ [Aa] ]]; then
printf "%b\n" "$actual" >"$approval_file"
pass "$cmd"
else
fail "$cmd"
fi
}
onexit() {
exitcode=$?
if [[ "$exitcode" == 0 ]]; then
green "\nFinished successfully"
else
red "\nFinished with failures"
fi
exit $exitcode
}
onerror() {
fail "Caller: $(caller)"
}
set -e
trap 'onexit' EXIT
trap 'onerror' ERR
if diff --help | grep -- --color >/dev/null 2>&1; then
diff_cmd="diff --unified --color=always"
else
diff_cmd="diff --unified"
fi