#!/usr/bin/env bash
# Inspired on official babashka install script https://github.com/babashka/babashka/blob/master/install
set -euo pipefail
version=""
checksum=""
default_install_dir="/usr/local/bin"
install_dir="$default_install_dir"
download_dir=""
print_help() {
echo "Installs latest (or specific) version of clojure-lsp. Installation directory defaults to $default_install_dir."
echo -e
echo "Usage:"
echo "install [--dir
] [--download-dir ] [--version or \"nightly\"] [--checksum ]"
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 " * 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)
# Retro compatible, always static if available for that arch.
shift
;;
*) # unknown option
print_help
;;
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
version="$(curl -sL https://raw.githubusercontent.com/clojure-lsp/clojure-lsp/master/lib/resources/CLOJURE_LSP_RELEASED_VERSION)"
fi
case "$(uname -s)" in
Linux*) platform=linux;;
Darwin*) platform=macos;;
esac
case "$(uname -m)" in
aarch64) arch=aarch64;;
arm64) arch=aarch64;;
*) arch=amd64;;
esac
ext="zip"
util="$(which unzip) -qqo"
case "$platform-$arch" in
linux-amd64) filename="clojure-lsp-native-static-$platform-$arch."$ext
;;
*) filename="clojure-lsp-native-$platform-$arch."$ext
;;
esac
if [[ "$version" == "nightly" ]]; then
download_url="https://github.com/clojure-lsp/clojure-lsp-dev-builds/releases/latest/download/$filename"
else
download_url="https://github.com/clojure-lsp/clojure-lsp/releases/download/$version/$filename"
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" | shasum -a 256 --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/clojure-lsp" ]; then
echo "Moving $install_dir/clojure-lsp to $install_dir/clojure-lsp.old"
mv -f "$install_dir/clojure-lsp" "$install_dir/clojure-lsp.old"
fi
mv -f "$download_dir/clojure-lsp" "$install_dir/clojure-lsp"
fi
if [[ "$version" == "nightly" ]]; then
chmod +x "$install_dir/clojure-lsp"
fi
echo "Successfully installed clojure-lsp in $install_dir"