Files
vim-ale/webi-essentials/install.sh
2024-01-15 23:01:01 -07:00

277 lines
7.3 KiB
Bash

#!/bin/sh
set -e
set -u
fn_install_webi_essentials_macos() { (
# streamline the output to be pretty
b_pkgs="$(
fn_check_pkg 'curl'
fn_check_pkg '/Library/Developer/CommandLineTools/usr/bin/git' 'git'
if test "$(uname -m)" = 'arm64'; then
fn_check_pkg '/Library/Apple/usr/libexec/oah/libRosettaRuntime' 'rosetta'
fi
fn_check_pkg 'tar'
# no wget because it requires brew
#fn_check_pkg 'wget'
fn_check_pkg 'xz'
fn_check_pkg 'zip'
)"
echo >&2 ""
#curl - built-in
# git
if ! xcode-select -p > /dev/null 2> /dev/null; then
cmd_xcode_cli_tools_install="xcode-select --install"
echo " Running $(t_cmd "${cmd_xcode_cli_tools_install}")"
$cmd_xcode_cli_tools_install 2> /dev/null
echo ""
echo ">>> $(t_attn 'ACTION REQUIRED') <<<"
echo ""
echo " $(t_attn "Click") '$(t_bold 'Install')' $(t_attn "in the pop-up")"
echo " (it may appear $(t_em 'under') this window)"
echo ""
echo "^^^ $(t_attn 'ACTION REQUIRED') ^^^"
echo ""
echo " waiting $(t_em 'for you') to finish installing Command Line Developer Tools ..."
while ! test -x /Library/Developer/CommandLineTools/usr/bin/git; do
sleep 0.25
done
echo " $(t_info 'OK')"
echo ""
sleep 1
fi
# rosetta
if test "$(uname -m)" = 'arm64'; then
# Also pkgutil --pkg-info com.apple.pkg.RosettaUpdateAuto
# See <https://apple.stackexchange.com/q/427970/27465>
cmd_install_rosetta="softwareupdate --install-rosetta --agree-to-license"
if ! arch -arch x86_64 uname -m > /dev/null 2>&1; then
echo " Running $(t_cmd "${cmd_install_rosetta}")"
$cmd_install_rosetta
fi
fi
#tar - built-in
#wget - skip
#xz
if ! command -v xz > /dev/null; then
echo " Running $(t_cmd "webi xz")"
~/.local/bin/webi xz
fi
#zip - built-in
# This should NEVER fail, but... Sanity check :)
{
b_pkgs_builtin="$(
fn_check_pkg 'curl'
fn_check_pkg 'tar'
fn_check_pkg 'zip'
)"
} 2> /dev/null
if test -n "${b_pkgs_builtin}"; then
echo ""
echo "error: expected these to be macOS built-ins:"
echo " ${b_pkgs}"
echo ""
exit 1
fi
echo " $(t_dim 'OK')"
); }
fn_check_pkg() { (
a_pkg="${1}"
a_pkgname="${2:-$a_pkg}"
printf >&2 ' %s %s %s' \
"$(t_dim "Checking for")" \
"$(t_pkg "${a_pkgname}")" \
"$(t_dim "...")"
if command -v "${a_pkg}" > /dev/null; then
echo >&2 " $(t_dim 'OK')"
return 0
fi
echo >&2 ' missing'
echo "${a_pkg}"
); }
###########
# mainish #
###########
fn_polite_sudo() { (
a_sudo="${1}"
a_cmds="${2}"
# no sudo needed, so don't ask
if test -z "${a_sudo}"; then
return 0
fi
# this is scripted, not user-interactive, continue
if test -z "${WEBI_TTY}"; then
return 0
fi
# this is user interactive, ask the user,defaulting to yes
echo ""
#shellcheck disable=SC2005 # echo for newline
echo "$(t_attn 'Use sudo for the following? [Y/n]')"
echo "${a_cmds}"
read -r b_yes < /dev/tty
b_yes="$(
echo "${b_yes}" |
tr '[:upper:]' '[:lower:]' |
tr -d '[:space:]'
)"
if test -z "${b_yes}" || test "${b_yes}" = "y" || test "${b_yes}" = "yes"; then
return 0
fi
echo " aborted"
return 1
); }
_install_webi_essentials() { (
if test "$(uname -s)" = 'Darwin'; then
fn_install_webi_essentials_macos
return 0
fi
b_pkgs="$(
fn_check_pkg 'curl'
fn_check_pkg 'git'
fn_check_pkg 'tar'
fn_check_pkg 'wget'
fn_check_pkg 'xz'
fn_check_pkg 'zip'
)"
b_pkgs="$(echo "${b_pkgs}" | tr '\n' ' ' | tr -s ' ')"
if test "${b_pkgs}" = " "; then
b_pkgs=''
fi
if test -z "${b_pkgs}"; then
echo " $(t_dim 'OK')"
return 0
fi
cmd_sudo=''
if test "$(id -u)" != "0"; then
echo " $(t_dim 'Checking for sudo ...')"
if command -v sudo > /dev/null; then
cmd_sudo='sudo '
else
if test "${b_pkgs}" = "xz"; then
_install_webi_essentials_webi "${cmd_sudo}" "${b_pkgs}"
echo " $(t_dim 'OK')"
return 0
fi
echo ""
echo ">>> $(t_warn 'WARNING') <<<"
echo ""
echo " You are not the 'root' user and there is no 'sudo'."
echo " (We'll try anyway but... this isn't going to work.)"
echo ""
echo "^^^ $(t_warn 'WARNING') ^^^"
echo ""
fi
fi
printf '%s' " $(t_dim 'Checking for apt/apk/pkg_add ...')"
if command -v apt > /dev/null; then
echo " $(t_pkg 'apt')"
_install_webi_essentials_apt "${cmd_sudo}" "${b_pkgs}"
echo " $(t_dim 'OK')"
return 0
fi
if command -v apk > /dev/null; then
echo " $(t_pkg 'apk')"
_install_webi_essentials_apk "${cmd_sudo}" "${b_pkgs}"
echo " $(t_dim 'OK')"
return 0
fi
if command -v pkg_add > /dev/null; then
echo " $(t_pkg 'pkg_add')"
_install_webi_essentials_pkg_add "${cmd_sudo}" "${b_pkgs}"
echo " $(t_dim 'OK')"
return 0
fi
echo " $(t_dim 'none')"
_install_webi_essentials_webi "${cmd_sudo}" "${b_pkgs}"
echo " $(t_dim 'OK')"
); }
_install_webi_essentials_apt() { (
cmd_sudo="${1}"
b_pkgs="${2}"
b_pkgs="$(echo "${b_pkgs}" | sed 's/xz/xz-utils/g')"
b_cmds="$(
printf ' %s\n %s' \
"$(t_cmd 'apt update')" \
"$(t_cmd "apt install -y ${b_pkgs}")"
)"
fn_polite_sudo "${cmd_sudo}" "${b_cmds}"
echo " $(t_dim 'Running') $(t_cmd "${cmd_sudo}apt update")"
${cmd_sudo} apt update
echo " $(t_dim 'Running') $(t_cmd "${cmd_sudo}apt install -y ${b_pkgs}")"
# shellcheck disable=SC2086
${cmd_sudo} apt install -y ${b_pkgs}
); }
_install_webi_essentials_apk() { (
cmd_sudo="${1}"
b_pkgs="${2}"
echo " $(t_dim 'Running') $(t_cmd "${cmd_sudo}apk add --no-cache")"
fn_polite_sudo "${cmd_sudo}" " $(t_cmd "apk add --no-cache ${b_pkgs}")"
# shellcheck disable=SC2086
${cmd_sudo} apk add --no-cache ${b_pkgs}
); }
_install_webi_essentials_pkg_add() { (
cmd_sudo="${1}"
b_pkgs="${2}"
echo " $(t_dim 'Running') $(t_cmd "${cmd_sudo}pkg_add")"
fn_polite_sudo "${cmd_sudo}" " $(t_cmd "pkg_add ${b_pkgs}")"
# shellcheck disable=SC2086
${cmd_sudo} pkg_add ${b_pkgs}
); }
_install_webi_essentials_webi() { (
cmd_sudo="${1}"
b_pkgs="${2}"
if test "${b_pkgs}" = 'xz'; then
~/.local/bin/webi xz
return 0
fi
if echo "${b_pkgs}" | grep -q xz; then
~/.local/bin/webi xz
b_pkgs="$(echo "${b_pkgs}" | sed 's/\sxz\s/ /')"
fi
echo ""
echo "error: unknown operating system:"
echo " $(uname -srm)"
if test -r /etc/issue; then
echo " $(cat /etc/issue)"
fi
echo ""
echo "$(t_err 'could not install'): $(t_warn "${b_pkgs}")"
echo ""
return 1
); }
_install_webi_essentials