-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·495 lines (444 loc) · 17.1 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·495 lines (444 loc) · 17.1 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
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
#!/usr/bin/env bash
{ # this ensures the entire script is downloaded #
beamer_has() {
type "$1" > /dev/null 2>&1
}
beamer_echo() {
command printf %s\\n "$*" 2>/dev/null
}
if [ -z "${BASH_VERSION}" ] || [ -n "${ZSH_VERSION}" ]; then
# shellcheck disable=SC2016
beamer_echo >&2 'Error: the install instructions explicitly say to pipe the install script to `bash`; please follow them'
exit 1
fi
beamer_grep() {
GREP_OPTIONS='' command grep "$@"
}
beamer_default_install_dir() {
[ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.beamer" || printf %s "${XDG_CONFIG_HOME}/beamer"
}
beamer_install_dir() {
if [ -n "$BEAMER_DIR" ]; then
printf %s "${BEAMER_DIR}"
else
beamer_default_install_dir
fi
}
beamer_latest_version() {
beamer_echo "v0.0.1"
}
beamer_profile_is_bash_or_zsh() {
local TEST_PROFILE
TEST_PROFILE="${1-}"
case "${TEST_PROFILE-}" in
*"/.bashrc" | *"/.bash_profile" | *"/.zshrc" | *"/.zprofile")
return
;;
*)
return 1
;;
esac
}
#
# Outputs the location to BEAMER depending on:
# * The availability of $BEAMER_SOURCE
# * The presence of $BEAMER_INSTALL_GITHUB_REPO
# * The method used ("script" or "git" in the script, defaults to "git")
# BEAMER_SOURCE always takes precedence unless the method is "script-beamer-exec"
#
beamer_source() {
local BEAMER_GITHUB_REPO
BEAMER_GITHUB_REPO="${BEAMER_INSTALL_GITHUB_REPO:-otpless-erlang/beamer}"
if [ "${BEAMER_GITHUB_REPO}" != 'otpless-erlang/beamer' ]; then
{ beamer_echo >&2 "$(cat)" ; } << EOF
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE REPO IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
The default repository for this install is \`otpless-erlang/beamer\`,
but the environment variables \`\$BEAMER_INSTALL_GITHUB_REPO\` is
currently set to \`${BEAMER_GITHUB_REPO}\`.
If this is not intentional, interrupt this installation and
verify your environment variables.
EOF
fi
local BEAMER_VERSION
BEAMER_VERSION="${BEAMER_INSTALL_VERSION:-$(beamer_latest_version)}"
local BEAMER_METHOD
BEAMER_METHOD="$1"
local BEAMER_SOURCE_URL
BEAMER_SOURCE_URL="$BEAMER_SOURCE"
if [ "_$BEAMER_METHOD" = "_script-beamer-exec" ]; then
BEAMER_SOURCE_URL="https://raw.githubusercontent.com/${BEAMER_GITHUB_REPO}/${BEAMER_VERSION}/beamer-exec"
elif [ "_$BEAMER_METHOD" = "_script-beamer-bash-completion" ]; then
BEAMER_SOURCE_URL="https://raw.githubusercontent.com/${BEAMER_GITHUB_REPO}/${BEAMER_VERSION}/bash_completion"
elif [ -z "$BEAMER_SOURCE_URL" ]; then
if [ "_$BEAMER_METHOD" = "_script" ]; then
BEAMER_SOURCE_URL="https://raw.githubusercontent.com/${BEAMER_GITHUB_REPO}/${BEAMER_VERSION}/beamer.sh"
elif [ "_$BEAMER_METHOD" = "_git" ] || [ -z "$BEAMER_METHOD" ]; then
BEAMER_SOURCE_URL="https://github.com/${BEAMER_GITHUB_REPO}.git"
else
beamer_echo >&2 "Unexpected value \"$BEAMER_METHOD\" for \$BEAMER_METHOD"
return 1
fi
fi
beamer_echo "$BEAMER_SOURCE_URL"
}
#
# OTPless Erlang version to install
#
beamer_beam_version() {
beamer_echo "$NODE_VERSION"
}
beamer_download() {
if beamer_has "curl"; then
curl --fail --compressed -q "$@"
elif beamer_has "wget"; then
# Emulate curl with wget
ARGS=$(beamer_echo "$@" | command sed -e 's/--progress-bar /--progress=bar /' \
-e 's/--compressed //' \
-e 's/--fail //' \
-e 's/-L //' \
-e 's/-I /--server-response /' \
-e 's/-s /-q /' \
-e 's/-sS /-nv /' \
-e 's/-o /-O /' \
-e 's/-C - /-c /')
# shellcheck disable=SC2086
eval wget $ARGS
fi
}
install_beamer_from_git() {
local INSTALL_DIR
INSTALL_DIR="$(beamer_install_dir)"
local BEAMER_VERSION
BEAMER_VERSION="${BEAMER_INSTALL_VERSION:-$(beamer_latest_version)}"
if [ -n "${BEAMER_INSTALL_VERSION:-}" ]; then
# Check if version is an existing ref
if command git ls-remote "$(beamer_source "git")" "$BEAMER_VERSION" | beamer_grep -q "$BEAMER_VERSION" ; then
:
# Check if version is an existing changeset
elif ! beamer_download -o /dev/null "$(beamer_source "script-beamer-exec")"; then
beamer_echo >&2 "Failed to find '$BEAMER_VERSION' version."
exit 1
fi
fi
local fetch_error
if [ -d "$INSTALL_DIR/.git" ]; then
# Updating repo
beamer_echo "=> beamer is already installed in $INSTALL_DIR, trying to update using git"
command printf '\r=> '
fetch_error="Failed to update beamer with $BEAMER_VERSION, run 'git fetch' in $INSTALL_DIR yourself."
else
fetch_error="Failed to fetch origin with $BEAMER_VERSION. Please report this!"
beamer_echo "=> Downloading beamer from git to '$INSTALL_DIR'"
command printf '\r=> '
mkdir -p "${INSTALL_DIR}"
if [ "$(ls -A "${INSTALL_DIR}")" ]; then
# Initializing repo
command git init "${INSTALL_DIR}" || {
beamer_echo >&2 'Failed to initialize beamer repo. Please report this!'
exit 2
}
command git --git-dir="${INSTALL_DIR}/.git" remote add origin "$(beamer_source)" 2> /dev/null \
|| command git --git-dir="${INSTALL_DIR}/.git" remote set-url origin "$(beamer_source)" || {
beamer_echo >&2 'Failed to add remote "origin" (or set the URL). Please report this!'
exit 2
}
else
# Cloning repo
command git clone "$(beamer_source)" --depth=1 "${INSTALL_DIR}" || {
beamer_echo >&2 'Failed to clone beamer repo. Please report this!'
exit 2
}
fi
fi
# Try to fetch tag
if command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" fetch origin tag "$BEAMER_VERSION" --depth=1 2>/dev/null; then
:
# Fetch given version
elif ! command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" fetch origin "$BEAMER_VERSION" --depth=1; then
beamer_echo >&2 "$fetch_error"
exit 1
fi
command git -c advice.detachedHead=false --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" checkout -f --quiet FETCH_HEAD || {
beamer_echo >&2 "Failed to checkout the given version $BEAMER_VERSION. Please report this!"
exit 2
}
if [ -n "$(command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" show-ref refs/heads/master)" ]; then
if command git --no-pager --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" branch --quiet 2>/dev/null; then
command git --no-pager --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" branch --quiet -D master >/dev/null 2>&1
else
beamer_echo >&2 "Your version of git is out of date. Please update it!"
command git --no-pager --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" branch -D master >/dev/null 2>&1
fi
fi
beamer_echo "=> Compressing and cleaning up git repository"
if ! command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" reflog expire --expire=now --all; then
beamer_echo >&2 "Your version of git is out of date. Please update it!"
fi
if ! command git --git-dir="$INSTALL_DIR"/.git --work-tree="$INSTALL_DIR" gc --auto --aggressive --prune=now ; then
beamer_echo >&2 "Your version of git is out of date. Please update it!"
fi
return
}
#
# Automatically install OTPless Erlang
#
beamer_install_beam() {
local NODE_VERSION_LOCAL
NODE_VERSION_LOCAL="$(beamer_beam_version)"
if [ -z "$NODE_VERSION_LOCAL" ]; then
return 0
fi
beamer_echo "=> Installing OTPless Erlang version $NODE_VERSION_LOCAL"
beamer install "$NODE_VERSION_LOCAL"
local CURRENT_BEAMER_NODE
CURRENT_BEAMER_NODE="$(beamer_version current)"
if [ "$(beamer_version "$NODE_VERSION_LOCAL")" == "$CURRENT_BEAMER_NODE" ]; then
beamer_echo "=> OTPless Erlang version $NODE_VERSION_LOCAL has been successfully installed"
else
beamer_echo >&2 "Failed to install OTPless Erlang $NODE_VERSION_LOCAL"
fi
}
install_beamer_as_script() {
local INSTALL_DIR
INSTALL_DIR="$(beamer_install_dir)"
local BEAMER_SOURCE_LOCAL
BEAMER_SOURCE_LOCAL="$(beamer_source script)"
local BEAMER_EXEC_SOURCE
BEAMER_EXEC_SOURCE="$(beamer_source script-beamer-exec)"
local BEAMER_BASH_COMPLETION_SOURCE
BEAMER_BASH_COMPLETION_SOURCE="$(beamer_source script-beamer-bash-completion)"
# Downloading to $INSTALL_DIR
mkdir -p "$INSTALL_DIR"
if [ -f "$INSTALL_DIR/beamer.sh" ]; then
beamer_echo "=> beamer is already installed in $INSTALL_DIR, trying to update the script"
else
beamer_echo "=> Downloading beamer as script to '$INSTALL_DIR'"
fi
beamer_download -s "$BEAMER_SOURCE_LOCAL" -o "$INSTALL_DIR/beamer.sh" || {
beamer_echo >&2 "Failed to download '$BEAMER_SOURCE_LOCAL'"
return 1
} &
beamer_download -s "$BEAMER_EXEC_SOURCE" -o "$INSTALL_DIR/beamer-exec" || {
beamer_echo >&2 "Failed to download '$BEAMER_EXEC_SOURCE'"
return 2
} &
beamer_download -s "$BEAMER_BASH_COMPLETION_SOURCE" -o "$INSTALL_DIR/bash_completion" || {
beamer_echo >&2 "Failed to download '$BEAMER_BASH_COMPLETION_SOURCE'"
return 2
} &
for job in $(jobs -p | command sort)
do
wait "$job" || return $?
done
chmod a+x "$INSTALL_DIR/beamer-exec" || {
beamer_echo >&2 "Failed to mark '$INSTALL_DIR/beamer-exec' as executable"
return 3
}
}
beamer_try_profile() {
if [ -z "${1-}" ] || [ ! -f "${1}" ]; then
return 1
fi
beamer_echo "${1}"
}
#
# Detect profile file if not specified as environment variable
# (eg: PROFILE=~/.myprofile)
# The echo'ed path is guaranteed to be an existing file
# Otherwise, an empty string is returned
#
beamer_detect_profile() {
if [ "${PROFILE-}" = '/dev/null' ]; then
# the user has specifically requested NOT to have beamer touch their profile
return
fi
if [ -n "${PROFILE}" ] && [ -f "${PROFILE}" ]; then
beamer_echo "${PROFILE}"
return
fi
local DETECTED_PROFILE
DETECTED_PROFILE=''
if [ "${SHELL#*bash}" != "$SHELL" ]; then
if [ -f "$HOME/.bashrc" ]; then
DETECTED_PROFILE="$HOME/.bashrc"
elif [ -f "$HOME/.bash_profile" ]; then
DETECTED_PROFILE="$HOME/.bash_profile"
fi
elif [ "${SHELL#*zsh}" != "$SHELL" ]; then
if [ -f "$HOME/.zshrc" ]; then
DETECTED_PROFILE="$HOME/.zshrc"
elif [ -f "$HOME/.zprofile" ]; then
DETECTED_PROFILE="$HOME/.zprofile"
fi
fi
if [ -z "$DETECTED_PROFILE" ]; then
for EACH_PROFILE in ".profile" ".bashrc" ".bash_profile" ".zprofile" ".zshrc"
do
if DETECTED_PROFILE="$(beamer_try_profile "${HOME}/${EACH_PROFILE}")"; then
break
fi
done
fi
if [ -n "$DETECTED_PROFILE" ]; then
beamer_echo "$DETECTED_PROFILE"
fi
}
#
# Check whether the user has any globally-installed BEAM packages in their
# system BEAM, and warn them if so.
#
beamer_check_global_packages() {
local BEAMY_COMMAND
BEAMY_COMMAND="$(command -v beamy 2>/dev/null)" || return 0
[ -n "${BEAMER_DIR}" ] && [ -z "${BEAMY_COMMAND%%"$BEAMER_DIR"/*}" ] && return 0
local BEAMY_VERSION
BEAMY_VERSION="$(beamy --version)"
BEAMY_VERSION="${BEAMY_VERSION:--1}"
[ "${BEAMY_VERSION%%[!-0-9]*}" -gt 0 ] || return 0
local BEAMY_GLOBAL_PACKAGES
BEAMY_GLOBAL_PACKAGES="$(
beamy list -g --depth=0 |
command sed -e '/ beamy@/d' -e '/ (empty)$/d'
)"
local PACKAGE_COUNT
PACKAGE_COUNT="$(
command printf %s\\n "$BEAMY_GLOBAL_PACKAGES" |
command sed -ne '1!p' | # Remove the first line
wc -l | command tr -d ' ' # Count entries
)"
if [ "${PACKAGE_COUNT}" != '0' ]; then
# shellcheck disable=SC2016
beamer_echo '=> You currently have packages installed globally with `beamy`. These will no'
# shellcheck disable=SC2016
beamer_echo '=> longer be linked to the active version of OTPless Erlang when you install a new version'
# shellcheck disable=SC2016
beamer_echo '=> with `beamer`; and they may (depending on how you construct your `$PATH`)'
# shellcheck disable=SC2016
beamer_echo '=> override the binaries of packages installed with `beamer`:'
beamer_echo
command printf %s\\n "$BEAMY_GLOBAL_PACKAGES"
beamer_echo '=> If you wish to uninstall them at a later point (or re-install them under your'
# shellcheck disable=SC2016
beamer_echo '=> `beamer` OTPless Erlang installs), you can remove them from the system BEAM as follows:'
beamer_echo
beamer_echo ' $ beamer use system'
beamer_echo ' $ beamy uninstall -g a_package'
beamer_echo
fi
}
beamer_do_install() {
if [ -n "${BEAMER_DIR-}" ] && ! [ -d "${BEAMER_DIR}" ]; then
if [ -e "${BEAMER_DIR}" ]; then
beamer_echo >&2 "File \"${BEAMER_DIR}\" has the same name as installation directory."
exit 1
fi
if [ "${BEAMER_DIR}" = "$(beamer_default_install_dir)" ]; then
mkdir "${BEAMER_DIR}"
else
beamer_echo >&2 "You have \$BEAMER_DIR set to \"${BEAMER_DIR}\", but that directory does not exist. Check your profile files and environment."
exit 1
fi
fi
# Disable the optional which check, https://www.shellcheck.net/wiki/SC2230
# shellcheck disable=SC2230
if beamer_has xcode-select && [ "$(xcode-select -p >/dev/null 2>/dev/null ; echo $?)" = '2' ] && [ "$(which git)" = '/usr/bin/git' ] && [ "$(which curl)" = '/usr/bin/curl' ]; then
beamer_echo >&2 'You may be on a Mac, and need to install the Xcode Command Line Developer Tools.'
# shellcheck disable=SC2016
beamer_echo >&2 'If so, run `xcode-select --install` and try again. If not, please report this!'
exit 1
fi
if [ -z "${METHOD}" ]; then
# Autodetect install method
if beamer_has git; then
install_beamer_from_git
elif beamer_has curl || beamer_has wget; then
install_beamer_as_script
else
beamer_echo >&2 'You need git, curl, or wget to install beamer'
exit 1
fi
elif [ "${METHOD}" = 'git' ]; then
if ! beamer_has git; then
beamer_echo >&2 "You need git to install beamer"
exit 1
fi
install_beamer_from_git
elif [ "${METHOD}" = 'script' ]; then
if ! beamer_has curl && ! beamer_has wget; then
beamer_echo >&2 "You need curl or wget to install beamer"
exit 1
fi
install_beamer_as_script
else
beamer_echo >&2 "The environment variable \$METHOD is set to \"${METHOD}\", which is not recognized as a valid installation method."
exit 1
fi
beamer_echo
local BEAMER_PROFILE
BEAMER_PROFILE="$(beamer_detect_profile)"
local PROFILE_INSTALL_DIR
PROFILE_INSTALL_DIR="$(beamer_install_dir | command sed "s:^$HOME:\$HOME:")"
SOURCE_STR="\\nexport BEAMER_DIR=\"${PROFILE_INSTALL_DIR}\"\\n[ -s \"\$BEAMER_DIR/beamer.sh\" ] && \\. \"\$BEAMER_DIR/beamer.sh\" # This loads beamer\\n"
# shellcheck disable=SC2016
COMPLETION_STR='[ -s "$BEAMER_DIR/bash_completion" ] && \. "$BEAMER_DIR/bash_completion" # This loads beamer bash_completion\n'
BASH_OR_ZSH=false
if [ -z "${BEAMER_PROFILE-}" ] ; then
local TRIED_PROFILE
if [ -n "${PROFILE}" ]; then
TRIED_PROFILE="${BEAMER_PROFILE} (as defined in \$PROFILE), "
fi
beamer_echo "=> Profile not found. Tried ${TRIED_PROFILE-}~/.bashrc, ~/.bash_profile, ~/.zprofile, ~/.zshrc, and ~/.profile."
beamer_echo "=> Create one of them and run this script again"
beamer_echo " OR"
beamer_echo "=> Append the following lines to the correct file yourself:"
command printf "${SOURCE_STR}"
beamer_echo
else
if beamer_profile_is_bash_or_zsh "${BEAMER_PROFILE-}"; then
BASH_OR_ZSH=true
fi
if ! command grep -qc '/beamer.sh' "$BEAMER_PROFILE"; then
beamer_echo "=> Appending beamer source string to $BEAMER_PROFILE"
command printf "${SOURCE_STR}" >> "$BEAMER_PROFILE"
else
beamer_echo "=> beamer source string already in ${BEAMER_PROFILE}"
fi
# shellcheck disable=SC2016
if ${BASH_OR_ZSH} && ! command grep -qc '$BEAMER_DIR/bash_completion' "$BEAMER_PROFILE"; then
beamer_echo "=> Appending bash_completion source string to $BEAMER_PROFILE"
command printf "$COMPLETION_STR" >> "$BEAMER_PROFILE"
else
beamer_echo "=> bash_completion source string already in ${BEAMER_PROFILE}"
fi
fi
if ${BASH_OR_ZSH} && [ -z "${BEAMER_PROFILE-}" ] ; then
beamer_echo "=> Please also append the following lines to the if you are using bash/zsh shell:"
command printf "${COMPLETION_STR}"
fi
# Source beamer
# shellcheck source=/dev/null
\. "$(beamer_install_dir)/beamer.sh"
beamer_check_global_packages
beamer_install_beam
beamer_reset
beamer_echo "=> Close and reopen your terminal to start using beamer or run the following to use it now:"
command printf "${SOURCE_STR}"
if ${BASH_OR_ZSH} ; then
command printf "${COMPLETION_STR}"
fi
}
#
# Unsets the various functions defined
# during the execution of the install script
#
beamer_reset() {
unset -f beamer_has beamer_install_dir beamer_latest_version beamer_profile_is_bash_or_zsh \
beamer_source beamer_beam_version beamer_download install_beamer_from_git beamer_install_beam \
install_beamer_as_script beamer_try_profile beamer_detect_profile beamer_check_global_packages \
beamer_do_install beamer_reset beamer_default_install_dir beamer_grep
}
[ "_$BEAMER_ENV" = "_testing" ] || beamer_do_install
} # this ensures the entire script is downloaded #