#!/bin/bash
+# shellcheck disable=2001
+# because I prefer to use sed rather than bash replace
+# (there's too little space in my head to learn both syntaxes)
+
function __bootstrap_webi() {
set -e
#PKG_ARCHES=
#PKG_FORMATS=
WEBI_UA="$(uname -a)"
+ WEBI_PKG_DOWNLOAD=""
+ WEBI_PKG_PATH="${HOME}/Downloads/webi/${PKG_NAME:-error}/${WEBI_VERSION:-latest}"
export WEBI_HOST
##
## Set up tmp, download, and install directories
##
- WEBI_TMP=${WEBI_TMP:-"$(mktemp -d -t webinstall-${WEBI_PKG:-}.XXXXXXXX)"}
+ WEBI_TMP=${WEBI_TMP:-"$(mktemp -d -t webinstall-"${WEBI_PKG:-}".XXXXXXXX)"}
export _webi_tmp="${_webi_tmp:-"$HOME/.local/opt/webi-tmp.d"}"
- mkdir -p "$HOME/Downloads"
+ mkdir -p "${WEBI_PKG_PATH}"
mkdir -p "$HOME/.local/bin"
mkdir -p "$HOME/.local/opt"
## Detect http client
##
set +e
- export WEBI_CURL="$(command -v curl)"
- export WEBI_WGET="$(command -v wget)"
+ WEBI_CURL="$(command -v curl)"
+ export WEBI_CURL
+ WEBI_WGET="$(command -v wget)"
+ export WEBI_WGET
set -e
# get the special formatted version (i.e. "go is go1.14" while node is "node v12.10.8")
fi
if [ -n "$(command -v pkg_format_cmd_version)" ]; then
- my_versioned_name="$(pkg_format_cmd_version "$WEBI_VERSION")"
+ my_versioned_name="'$(pkg_format_cmd_version "$WEBI_VERSION")'"
else
- my_versioned_name="'$pkg_cmd_name' v$WEBI_VERSION"
+ my_versioned_name="'$pkg_cmd_name v$WEBI_VERSION'"
fi
echo "$my_versioned_name"
}
# update symlinks according to $HOME/.local/opt and $HOME/.local/bin install paths.
+ # shellcheck disable=2120
+ # webi_link may be used in the templated install script
webi_link() {
if [ -n "$(command -v pkg_link)" ]; then
pkg_link
# Test for existing version
set +e
my_path="$PATH"
- export PATH="$(dirname "$pkg_dst_cmd"):$PATH"
+ PATH="$(dirname "$pkg_dst_cmd"):$PATH"
+ export PATH
my_current_cmd="$(command -v "$pkg_cmd_name")"
set -e
if [ -n "$my_current_cmd" ]; then
- pkg_current_version="$(pkg_get_current_version 2> /dev/null | head -n 1)"
- # remove trailing '.0's for golang's sake
- my_current_version="$(echo $pkg_current_version | sed 's:\.0::g')"
- my_src_version="$(echo $WEBI_VERSION | sed 's:\.0::g')"
my_canonical_name="$(_webi_canonical_name)"
- if [ "$my_src_version" == "$my_current_version" ]; then
- echo "$my_canonical_name already installed at $my_current_cmd"
- exit 0
- else
- if [ "$my_current_cmd" != "$pkg_dst_cmd" ]; then
- echo >&2 "WARN: possible conflict between $my_canonical_name and $pkg_current_version at $my_current_cmd"
- fi
- if [ -x "$pkg_src_cmd" ]; then
- webi_link
- echo "switched to $my_canonical_name at $pkg_src"
- exit 0
+ if [ "$my_current_cmd" != "$pkg_dst_cmd" ]; then
+ echo >&2 "WARN: possible PATH conflict between $my_canonical_name and currently installed version"
+ echo >&2 " ${pkg_dst_cmd} (new)"
+ echo >&2 " ${my_current_cmd} (existing)"
+ #my_current_version=false
+ fi
+ # 'readlink' can't read links in paths on macOS 🤦
+ # but that's okay, 'cmp -s' is good enough for us
+ if cmp -s "${pkg_src_cmd}" "${my_current_cmd}"; then
+ echo "${my_canonical_name} already installed:"
+ echo -n " ${pkg_dst}"
+ if [[ ${pkg_src_cmd} != "${my_current_cmd}" ]]; then
+ echo -n " => ${pkg_src}"
fi
+ echo ""
+ exit 0
+ fi
+ if [ -x "$pkg_src_cmd" ]; then
+ # shellcheck disable=2119
+ # this function takes no args
+ webi_link
+ echo "switched to $my_canonical_name:"
+ echo " ${pkg_dst} => ${pkg_src}"
+ exit 0
fi
fi
export PATH="$my_path"
else
if [ "error" == "$WEBI_CHANNEL" ]; then
# TODO pass back requested OS / Arch / Version
- echo >&2 "Error: no '$PKG_NAME' release for '$WEBI_OS' on '$WEBI_ARCH' as one of '$WEBI_FORMATS' by the tag '$WEBI_TAG'"
+ echo >&2 "Error: no '$PKG_NAME' release for '${WEBI_OS:-}' on '$WEBI_ARCH' as one of '$WEBI_FORMATS' by the tag '${WEBI_TAG:-}'"
echo >&2 " '$PKG_NAME' is available for '$PKG_OSES' on '$PKG_ARCHES' as one of '$PKG_FORMATS'"
echo >&2 " (check that the package name and version are correct)"
echo >&2 ""
if [ -n "${2:-}" ]; then
my_dl="$2"
else
- my_dl="$HOME/Downloads/$WEBI_PKG_FILE"
+ my_dl="${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
fi
+ WEBI_PKG_DOWNLOAD="${my_dl}"
+ export WEBI_PKG_DOWNLOAD
+
if [ -e "$my_dl" ]; then
echo "Found $my_dl"
return 0
if [[ $- == *i* ]]; then
my_show_progress="--show-progress"
fi
- wget -q $my_show_progress --user-agent="wget $WEBI_UA" -c "$my_url" -O "$my_dl.part"
- if ! [ $? -eq 0 ]; then
+ if ! wget -q $my_show_progress --user-agent="wget $WEBI_UA" -c "$my_url" -O "$my_dl.part"; then
echo >&2 "failed to download from $WEBI_PKG_URL"
exit 1
fi
if [[ $- == *i* ]]; then
my_show_progress=""
fi
+ # shellcheck disable=SC2086
+ # we want the flags to be split
curl -fSL $my_show_progress -H "User-Agent: curl $WEBI_UA" "$my_url" -o "$my_dl.part"
fi
mv "$my_dl.part" "$my_dl"
# detect which archives can be used
webi_extract() {
- pushd "$WEBI_TMP" 2>&1 > /dev/null
+ pushd "$WEBI_TMP" > /dev/null 2>&1
if [ "tar" == "$WEBI_EXT" ]; then
- echo "Extracting $HOME/Downloads/$WEBI_PKG_FILE"
- tar xf "$HOME/Downloads/$WEBI_PKG_FILE"
+ echo "Extracting ${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
+ tar xf "${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
elif [ "zip" == "$WEBI_EXT" ]; then
- echo "Extracting $HOME/Downloads/$WEBI_PKG_FILE"
- unzip "$HOME/Downloads/$WEBI_PKG_FILE" > __unzip__.log
+ echo "Extracting ${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
+ unzip "${WEBI_PKG_PATH}/$WEBI_PKG_FILE" > __unzip__.log
elif [ "exe" == "$WEBI_EXT" ]; then
- echo "Moving $HOME/Downloads/$WEBI_PKG_FILE"
- mv "$HOME/Downloads/$WEBI_PKG_FILE" .
+ echo "Moving ${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
+ mv "${WEBI_PKG_PATH}/$WEBI_PKG_FILE" .
elif [ "xz" == "$WEBI_EXT" ]; then
- echo "Inflating $HOME/Downloads/$WEBI_PKG_FILE"
- unxz -c "$HOME/Downloads/$WEBI_PKG_FILE" > $(basename "$WEBI_PKG_FILE")
+ echo "Inflating ${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
+ unxz -c "${WEBI_PKG_PATH}/$WEBI_PKG_FILE" > "$(basename "$WEBI_PKG_FILE")"
else
# do nothing
- echo "Failed to extract $HOME/Downloads/$WEBI_PKG_FILE"
+ echo "Failed to extract ${WEBI_PKG_PATH}/$WEBI_PKG_FILE"
exit 1
fi
- popd 2>&1 > /dev/null
+ popd > /dev/null 2>&1
}
# use 'pathman' to update $HOME/.config/envman/PATH.env
}
# move commands from the extracted archive directory to $HOME/.local/opt or $HOME/.local/bin
+ # shellcheck disable=2120
+ # webi_install may be sourced and used elsewhere
webi_install() {
if [ -n "$WEBI_SINGLE" ] || [ "single" == "${1:-}" ]; then
- mkdir -p "$(dirname $pkg_src_cmd)"
+ mkdir -p "$(dirname "$pkg_src_cmd")"
mv ./"$pkg_cmd_name"* "$pkg_src_cmd"
else
rm -rf "$pkg_src"
WEBI_SINGLE=
- echo ""
- echo "Thanks for using webi to install '$PKG_NAME' on '$WEBI_OS/$WEBI_ARCH'."
- echo "Have a problem? Experience a bug? Please let us know:"
- echo " https://github.com/webinstall/packages/issues"
- echo ""
+ if [[ -z ${WEBI_WELCOME:-} ]]; then
+ echo ""
+ printf "Thanks for using webi to install '\e[32m${WEBI_PKG:-}\e[0m' on '\e[31m$(uname -s)/$(uname -m)\e[0m'.\n"
+ echo "Have a problem? Experience a bug? Please let us know:"
+ echo " https://github.com/webinstall/webi-installers/issues"
+ echo ""
+ printf "\e[31mLovin'\e[0m it? Say thanks with a \e[34mStar on GitHub\e[0m:\n"
+ printf " \e[32mhttps://github.com/webinstall/webi-installers\e[0m\n"
+ echo ""
+ fi
function __init_installer() {
- {{ installer }}
+ # do nothing - to satisfy parser prior to templating
+ echo -n ""
+
+ # {{ installer }}
}
##
# run everything with defaults or overrides as needed
- if [ -n "$(command -v pkg_get_current_version)" ]; then
+ if command -v pkg_install > /dev/null ||
+ command -v pkg_link > /dev/null ||
+ command -v pkg_post_install > /dev/null ||
+ command -v pkg_done_message > /dev/null ||
+ command -v pkg_format_cmd_version > /dev/null ||
+ [[ -n ${WEBI_SINGLE:-} ]] ||
+ [[ -n ${pkg_cmd_name:-} ]] ||
+ [[ -n ${pkg_dst_cmd:-} ]] ||
+ [[ -n ${pkg_dst_dir:-} ]] ||
+ [[ -n ${pkg_dst:-} ]] ||
+ [[ -n ${pkg_src_cmd:-} ]] ||
+ [[ -n ${pkg_src_dir:-} ]] ||
+ [[ -n ${pkg_src:-} ]]; then
+
pkg_cmd_name="${pkg_cmd_name:-$PKG_NAME}"
if [ -n "$WEBI_SINGLE" ]; then
pkg_src="${pkg_src:-$HOME/.local/opt/$pkg_cmd_name-v$WEBI_VERSION}"
pkg_src_cmd="${pkg_src_cmd:-$pkg_src/bin/$pkg_cmd_name}"
fi
+ # this script is templated and these are used elsewhere
+ # shellcheck disable=SC2034
pkg_src_bin="$(dirname "$pkg_src_cmd")"
+ # shellcheck disable=SC2034
pkg_dst_bin="$(dirname "$pkg_dst_cmd")"
- [ -n "$(command -v pkg_pre_install)" ] && pkg_pre_install || webi_pre_install
+ if [[ -n "$(command -v pkg_pre_install)" ]]; then pkg_pre_install; else webi_pre_install; fi
- pushd "$WEBI_TMP" 2>&1 > /dev/null
+ pushd "$WEBI_TMP" > /dev/null 2>&1
echo "Installing to $pkg_src_cmd"
- [ -n "$(command -v pkg_install)" ] && pkg_install || webi_install
+ if [[ -n "$(command -v pkg_install)" ]]; then pkg_install; else webi_install; fi
chmod a+x "$pkg_src"
chmod a+x "$pkg_src_cmd"
- popd 2>&1 > /dev/null
+ popd > /dev/null 2>&1
webi_link
_webi_enable_exec
- pushd "$WEBI_TMP" 2>&1 > /dev/null
- [ -n "$(command -v pkg_post_install)" ] && pkg_post_install || webi_post_install
- popd 2>&1 > /dev/null
+ pushd "$WEBI_TMP" > /dev/null 2>&1
+ if [[ -n "$(command -v pkg_post_install)" ]]; then pkg_post_install; else webi_post_install; fi
+ popd > /dev/null 2>&1
- pushd "$WEBI_TMP" 2>&1 > /dev/null
- [ -n "$(command -v pkg_done_message)" ] && pkg_done_message || _webi_done_message
- popd 2>&1 > /dev/null
+ pushd "$WEBI_TMP" > /dev/null 2>&1
+ if [[ -n "$(command -v pkg_done_message)" ]]; then pkg_done_message; else _webi_done_message; fi
+ popd > /dev/null 2>&1
echo ""
fi
webi_path_add "$HOME/.local/bin"
- if [ -z "${_WEBI_CHILD:-}" ] && [ -f '$_webi_tmp/.PATH.env' ]; then
- echo "You need to update your PATH to use $PKG_NAME:"
- echo ""
- cat "$_webi_tmp/.PATH.env" | sort -u
- rm -f "$_webi_tmp/.PATH.env"
+ if [[ -z ${_WEBI_CHILD:-} ]] && [[ -f "$_webi_tmp/.PATH.env" ]]; then
+ if [[ -n $(cat "$_webi_tmp/.PATH.env") ]]; then
+ echo "You need to update your PATH to use $PKG_NAME:"
+ echo ""
+ sort -u "$_webi_tmp/.PATH.env"
+ rm -f "$_webi_tmp/.PATH.env"
+ fi
fi
# cleanup the temp directory