#!/usr/bin/env bash
set -euo pipefail
version=""
checksum=""
static_binary="false"
default_install_dir="/usr/local/bin"
install_dir="$default_install_dir"
download_dir=""
dev_build=""
print_help() {
echo "Installs latest (or specific) version of babashka. Installation directory defaults to /usr/local/bin."
echo -e
echo "Usage:"
echo "install [--dir
] [--download-dir ] [--version ] [--checksum ] [--static]"
echo -e
echo "Defaults:"
echo " * Installation directory: ${default_install_dir}"
echo " * Download directory: temporary"
if [[ -z "$checksum" ]]; then
echo " * Checksum: no"
else
echo " * Checksum: ${checksum}"
fi
echo " * Static binary: ${static_binary}"
echo " * Version: "
exit 1
}
while [[ $# -gt 0 ]]
do
key="$1"
case "$key" in
--dir)
install_dir="$2"
shift
shift
;;
--download-dir)
download_dir="$2"
shift
shift
;;
--version)
version="$2"
shift
shift
;;
--checksum)
checksum="$2"
shift
shift
;;
--static)
static_binary="true"
shift
;;
--dev-build)
dev_build="true"
shift
;;
*) # unknown option
print_help
shift
;;
esac
done
if [[ -z "$download_dir" ]]; then
download_dir="$(mktemp -d)"
trap 'rm -rf "$download_dir"' EXIT
fi
if [[ "$checksum" != "" ]] && [[ "$version" == "" ]]; then
>&2 echo "Options --checksum and --version should be provided together!"
exit 1
fi
if [[ "$version" == "" ]]; then
if [[ "$dev_build" == "true" ]]; then
version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_VERSION)"
else
version="$(curl -sL https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
fi
fi
case "$(uname -s)" in
Linux*) platform=linux;;
Darwin*) platform=macos;;
esac
# Ugly ugly conversion of version to a comparable number
IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}"
vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}")
case "$(uname -m)" in
aarch64) arch=aarch64
if [[ "$platform" == "linux" ]]; then
static_binary="true"
fi
;;
arm64) if [[ 10#$vernum -le 10#000008002 ]]; then
arch="amd64"
else
arch="aarch64"
fi
;;
*) arch=amd64
# always use static image on linux
if [[ "$platform" == "linux" ]]; then
static_binary="true"
fi
;;
esac
if [[ 10#$vernum -le 10#000002013 ]]; then
ext="zip"
util="$(which unzip) -qqo"
else
ext="tar.gz"
util="$(which tar) -zxf"
fi
case "$platform-$static_binary" in
linux-true) filename="babashka-$version-$platform-$arch-static."$ext
;;
*-true) >&2 echo "Static binaries are only available in Linux platform! Using the non-static one..."
filename="babashka-$version-$platform-$arch."$ext
;;
*) filename="babashka-$version-$platform-$arch."$ext
;;
esac
if [[ "$version" == *-SNAPSHOT ]]
then
repo="babashka-dev-builds"
else
repo="babashka"
fi
download_url="https://github.com/babashka/$repo/releases/download/v$version/$filename"
# macOS only have shasum available by default
# Some Linux distros (RHEL-like) only have sha256sum available by default (others have both)
if command -v sha256sum >/dev/null; then
sha256sum_cmd="sha256sum"
elif command -v shasum >/dev/null; then
sha256sum_cmd="shasum -a 256"
else
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
>&2 echo "Exiting..."
exit 1
fi
# Running this part in a subshell so when it finishes we go back to the previous directory
mkdir -p "$download_dir" && (
cd "$download_dir"
echo -e "Downloading $download_url to $download_dir"
curl -o "$filename" -sL "$download_url"
if [[ -n "$checksum" ]]; then
if ! echo "$checksum *$filename" | $sha256sum_cmd --check --status; then
>&2 echo "Failed checksum on $filename"
>&2 echo "Got: $(shasum -a 256 "$filename" | cut -d' ' -f1)"
>&2 echo "Expected: $checksum"
exit 1
fi
fi
$util "$filename"
rm -f "$filename"
)
if [[ "$download_dir" != "$install_dir" ]]
then
mkdir -p "$install_dir"
if [ -f "$install_dir/bb" ]; then
echo "Moving $install_dir/bb to $install_dir/bb.old"
mv -f "$install_dir/bb" "$install_dir/bb.old"
fi
mv -f "$download_dir/bb" "$install_dir/bb"
fi
echo "Successfully installed bb in $install_dir"