2019-08-11 07:22:57 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
2020-09-25 16:37:38 +00:00
|
|
|
version=""
|
2021-05-14 19:05:38 +00:00
|
|
|
checksum=""
|
|
|
|
|
static_binary="false"
|
2020-09-25 16:37:38 +00:00
|
|
|
default_install_dir="/usr/local/bin"
|
2021-05-14 19:05:38 +00:00
|
|
|
install_dir="$default_install_dir"
|
2021-05-28 15:07:52 +00:00
|
|
|
download_dir=""
|
2022-12-09 18:12:16 +00:00
|
|
|
dev_build=""
|
2020-09-25 16:37:38 +00:00
|
|
|
|
2019-08-11 07:22:57 +00:00
|
|
|
print_help() {
|
2020-09-25 16:37:38 +00:00
|
|
|
echo "Installs latest (or specific) version of babashka. Installation directory defaults to /usr/local/bin."
|
2019-08-11 07:22:57 +00:00
|
|
|
echo -e
|
|
|
|
|
echo "Usage:"
|
2021-05-14 19:05:38 +00:00
|
|
|
echo "install [--dir <dir>] [--download-dir <download-dir>] [--version <version>] [--checksum <checksum>] [--static]"
|
2020-12-23 18:30:30 +00:00
|
|
|
echo -e
|
|
|
|
|
echo "Defaults:"
|
|
|
|
|
echo " * Installation directory: ${default_install_dir}"
|
2021-05-28 15:07:52 +00:00
|
|
|
echo " * Download directory: temporary"
|
2021-05-14 19:05:38 +00:00
|
|
|
if [[ -z "$checksum" ]]; then
|
|
|
|
|
echo " * Checksum: no"
|
|
|
|
|
else
|
|
|
|
|
echo " * Checksum: ${checksum}"
|
|
|
|
|
fi
|
|
|
|
|
echo " * Static binary: ${static_binary}"
|
2020-12-23 18:30:30 +00:00
|
|
|
echo " * Version: <Latest release on github>"
|
2019-08-11 07:22:57 +00:00
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-04 08:27:03 +00:00
|
|
|
has() {
|
|
|
|
|
command -v "$1" >/dev/null 2>&1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fetch() {
|
|
|
|
|
local url=$1
|
|
|
|
|
local outfile=${2:-}
|
|
|
|
|
|
|
|
|
|
if has wget; then
|
|
|
|
|
if [[ -n $outfile ]]; then
|
|
|
|
|
wget -qO "$outfile" "$url"
|
|
|
|
|
else
|
|
|
|
|
wget -qO - "$url"
|
|
|
|
|
fi
|
|
|
|
|
elif has curl; then
|
|
|
|
|
if [[ -n $outfile ]]; then
|
|
|
|
|
curl -fsSL "$url" -o "$outfile"
|
|
|
|
|
else
|
|
|
|
|
curl -fsSL "$url"
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
>&2 echo "Either 'wget' or 'curl' needs to be on PATH!"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-14 19:05:38 +00:00
|
|
|
while [[ $# -gt 0 ]]
|
2020-09-25 16:37:38 +00:00
|
|
|
do
|
|
|
|
|
key="$1"
|
2021-05-14 19:05:38 +00:00
|
|
|
case "$key" in
|
2020-09-25 16:37:38 +00:00
|
|
|
--dir)
|
|
|
|
|
install_dir="$2"
|
|
|
|
|
shift
|
|
|
|
|
shift
|
|
|
|
|
;;
|
2020-12-23 18:30:30 +00:00
|
|
|
--download-dir)
|
|
|
|
|
download_dir="$2"
|
|
|
|
|
shift
|
|
|
|
|
shift
|
|
|
|
|
;;
|
2020-09-25 16:37:38 +00:00
|
|
|
--version)
|
|
|
|
|
version="$2"
|
|
|
|
|
shift
|
|
|
|
|
shift
|
|
|
|
|
;;
|
2021-05-14 19:05:38 +00:00
|
|
|
--checksum)
|
|
|
|
|
checksum="$2"
|
|
|
|
|
shift
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
--static)
|
|
|
|
|
static_binary="true"
|
|
|
|
|
shift
|
|
|
|
|
;;
|
2022-12-09 18:12:16 +00:00
|
|
|
--dev-build)
|
|
|
|
|
dev_build="true"
|
|
|
|
|
shift
|
|
|
|
|
;;
|
2020-09-25 16:37:38 +00:00
|
|
|
*) # unknown option
|
|
|
|
|
print_help
|
|
|
|
|
shift
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
2021-05-28 15:07:52 +00:00
|
|
|
if [[ -z "$download_dir" ]]; then
|
|
|
|
|
download_dir="$(mktemp -d)"
|
|
|
|
|
trap 'rm -rf "$download_dir"' EXIT
|
|
|
|
|
fi
|
|
|
|
|
|
2021-05-14 19:05:38 +00:00
|
|
|
if [[ "$checksum" != "" ]] && [[ "$version" == "" ]]; then
|
|
|
|
|
>&2 echo "Options --checksum and --version should be provided together!"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2020-09-25 16:37:38 +00:00
|
|
|
if [[ "$version" == "" ]]; then
|
2022-12-09 18:12:16 +00:00
|
|
|
if [[ "$dev_build" == "true" ]]; then
|
2025-05-04 08:27:03 +00:00
|
|
|
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_VERSION)"
|
2022-12-09 18:12:16 +00:00
|
|
|
else
|
2025-05-04 08:27:03 +00:00
|
|
|
version="$(fetch https://raw.githubusercontent.com/babashka/babashka/master/resources/BABASHKA_RELEASED_VERSION)"
|
2022-12-09 18:12:16 +00:00
|
|
|
fi
|
2020-09-25 16:37:38 +00:00
|
|
|
fi
|
2019-08-11 07:22:57 +00:00
|
|
|
|
|
|
|
|
case "$(uname -s)" in
|
2021-05-28 21:43:31 +00:00
|
|
|
Linux*) platform=linux;;
|
|
|
|
|
Darwin*) platform=macos;;
|
2019-08-11 07:22:57 +00:00
|
|
|
esac
|
|
|
|
|
|
2021-03-12 09:16:39 +00:00
|
|
|
# Ugly ugly conversion of version to a comparable number
|
2021-12-26 22:35:24 +00:00
|
|
|
IFS='.' read -ra VER <<< "${version//-SNAPSHOT/}"
|
2021-03-12 09:16:39 +00:00
|
|
|
vernum=$(printf "%03d%03d%03d" "${VER[0]}" "${VER[1]}" "${VER[2]}")
|
|
|
|
|
|
2022-06-07 21:12:33 +00:00
|
|
|
case "$(uname -m)" in
|
2023-05-29 09:10:40 +00:00
|
|
|
aarch64) arch=aarch64
|
|
|
|
|
if [[ "$platform" == "linux" ]]; then
|
|
|
|
|
static_binary="true"
|
|
|
|
|
fi
|
|
|
|
|
;;
|
2022-06-07 21:12:33 +00:00
|
|
|
arm64) if [[ 10#$vernum -le 10#000008002 ]]; then
|
|
|
|
|
arch="amd64"
|
|
|
|
|
else
|
|
|
|
|
arch="aarch64"
|
|
|
|
|
fi
|
|
|
|
|
;;
|
2022-12-09 11:51:33 +00:00
|
|
|
*) arch=amd64
|
|
|
|
|
# always use static image on linux
|
|
|
|
|
if [[ "$platform" == "linux" ]]; then
|
|
|
|
|
static_binary="true"
|
|
|
|
|
fi
|
|
|
|
|
;;
|
2022-06-07 21:12:33 +00:00
|
|
|
esac
|
|
|
|
|
|
2021-12-04 14:54:41 +00:00
|
|
|
if [[ 10#$vernum -le 10#000002013 ]]; then
|
2022-06-07 21:12:33 +00:00
|
|
|
ext="zip"
|
|
|
|
|
util="$(which unzip) -qqo"
|
2021-03-12 09:16:39 +00:00
|
|
|
else
|
2022-06-07 21:12:33 +00:00
|
|
|
ext="tar.gz"
|
|
|
|
|
util="$(which tar) -zxf"
|
2021-03-12 09:16:39 +00:00
|
|
|
fi
|
|
|
|
|
|
2021-05-28 21:43:31 +00:00
|
|
|
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
|
|
|
|
|
|
2021-12-26 22:24:48 +00:00
|
|
|
if [[ "$version" == *-SNAPSHOT ]]
|
|
|
|
|
then
|
|
|
|
|
repo="babashka-dev-builds"
|
|
|
|
|
else
|
|
|
|
|
repo="babashka"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
download_url="https://github.com/babashka/$repo/releases/download/v$version/$filename"
|
2019-08-11 07:22:57 +00:00
|
|
|
|
2021-12-16 14:26:33 +00:00
|
|
|
# macOS only have shasum available by default
|
2022-10-21 08:43:46 +00:00
|
|
|
# Some Linux distros (RHEL-like) only have sha256sum available by default (others have both)
|
2025-05-04 08:27:03 +00:00
|
|
|
if has sha256sum; then
|
2022-06-07 21:12:33 +00:00
|
|
|
sha256sum_cmd="sha256sum"
|
2025-05-04 08:27:03 +00:00
|
|
|
elif has shasum; then
|
2022-06-07 21:12:33 +00:00
|
|
|
sha256sum_cmd="shasum -a 256"
|
2021-12-16 14:26:33 +00:00
|
|
|
else
|
2022-06-07 21:12:33 +00:00
|
|
|
>&2 echo "Either 'sha256sum' or 'shasum' needs to be on PATH for '--checksum' flag!"
|
|
|
|
|
>&2 echo "Exiting..."
|
|
|
|
|
exit 1
|
2021-12-16 14:26:33 +00:00
|
|
|
fi
|
|
|
|
|
|
2021-05-28 15:07:52 +00:00
|
|
|
# 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"
|
|
|
|
|
|
2025-05-04 08:27:03 +00:00
|
|
|
fetch "$download_url" "$filename"
|
2021-05-28 15:07:52 +00:00
|
|
|
if [[ -n "$checksum" ]]; then
|
2021-12-16 14:26:33 +00:00
|
|
|
if ! echo "$checksum *$filename" | $sha256sum_cmd --check --status; then
|
2021-05-28 15:07:52 +00:00
|
|
|
>&2 echo "Failed checksum on $filename"
|
|
|
|
|
>&2 echo "Got: $(shasum -a 256 "$filename" | cut -d' ' -f1)"
|
|
|
|
|
>&2 echo "Expected: $checksum"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
2021-05-14 19:05:38 +00:00
|
|
|
fi
|
2021-05-28 15:07:52 +00:00
|
|
|
$util "$filename"
|
|
|
|
|
rm -f "$filename"
|
|
|
|
|
)
|
2019-08-11 07:22:57 +00:00
|
|
|
|
2021-05-14 19:05:38 +00:00
|
|
|
if [[ "$download_dir" != "$install_dir" ]]
|
2020-12-23 18:30:30 +00:00
|
|
|
then
|
|
|
|
|
mkdir -p "$install_dir"
|
2021-03-12 09:16:39 +00:00
|
|
|
if [ -f "$install_dir/bb" ]; then
|
2020-12-23 18:30:30 +00:00
|
|
|
echo "Moving $install_dir/bb to $install_dir/bb.old"
|
2021-05-28 15:07:52 +00:00
|
|
|
mv -f "$install_dir/bb" "$install_dir/bb.old"
|
2020-12-23 18:30:30 +00:00
|
|
|
fi
|
2021-03-12 09:16:39 +00:00
|
|
|
mv -f "$download_dir/bb" "$install_dir/bb"
|
2019-08-11 07:22:57 +00:00
|
|
|
fi
|
|
|
|
|
|
2020-12-23 18:55:34 +00:00
|
|
|
echo "Successfully installed bb in $install_dir"
|