#!/bin/bash # # Copyright 2021-2024 JetBrains s.r.o. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # RELEASE=${1} TMP_DIR="/tmp/tmpinstalldir" OUT_DIR=${2:-"/usr/local/bin"} check_mark="\033[1;32m✓\033[0m" echo -e ' _ _ /\ \ /\ \ Qodana CLI (installer) / \ \ / \ \ Documentation / /\ \ \ / /\ \ \ https://jb.gg/qodana-docs / / /\ \ \ / / /\ \ \ Contact us at / / / \ \_\ / / / \ \_\ qodana-support@jetbrains.com / / / _ / / / / / / / / / Or via our issue tracker / / / /\ \/ / / / / / / / https://jb.gg/qodana-issue / / /__\ \ \/ / / /___/ / / Or share your feedback at our forum / / /____\ \ \ / / /____\/ / https://jb.gg/qodana-forum \/________\_\/ \/_________/ ' echo -e " 👋 This script will download Qodana CLI to \033[4m/usr/local/bin/qodana\033[0m If you get 'permission denied' error: - Specify other dir and version: \033[4mcurl -fsSL https://jb.gg/qodana-cli/install | bash -s -- v2023.2.8 $HOME/.local/bin\033[0m - Or change the owner of $OUT_DIR to your user If you get API rate limit exceeded error: - Specify the version, so the script does not query GitHub API: \033[4mcurl -fsSL https://jb.gg/qodana-cli/install | bash -s -- v2023.2.8 \033[0m " set -e function cleanup { echo rm -rf $TMP_DIR > /dev/null } function header() { echo -e "\n\033[1m$1\033[0m"; } function fail { cleanup msg=$1 echo "============" echo "Error: $msg" 1>&2 exit 1 } function install { set -e if [ -z "$RELEASE" ]; then LATEST=$(curl --silent "https://api.github.com/repos/jetbrains/qodana-cli/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') RELEASE=$LATEST fi USER="JetBrains" PROG="qodana" INSECURE="false" #bash check [ ! "$BASH_VERSION" ] && fail "Please use bash instead" [ ! -d $OUT_DIR ] && fail "output directory missing: $OUT_DIR" #dependency check, assume we are a standard POSIX machine which find > /dev/null || fail "find not installed" which xargs > /dev/null || fail "xargs not installed" which sort > /dev/null || fail "sort not installed" which tail > /dev/null || fail "tail not installed" which cut > /dev/null || fail "cut not installed" which du > /dev/null || fail "du not installed" GET="" if which curl > /dev/null; then GET="curl" if [[ $INSECURE = "true" ]]; then GET="$GET --insecure"; fi GET="$GET --fail -# -L" elif which wget > /dev/null; then GET="wget" if [[ $INSECURE = "true" ]]; then GET="$GET --no-check-certificate"; fi GET="$GET -qO-" else fail "neither wget/curl are installed" fi case $(uname -s) in Darwin) OS="darwin";; Linux) OS="linux";; *) fail "unknown os: $(uname -s)";; esac #find ARCH if [[ $(uname -m) == "x86_64" ]]; then ARCH="amd64" elif [[ $(uname -m) == "aarch64" || $(uname -m) == "arm64" ]]; then ARCH="arm" else fail "unknown arch: $(uname -m)" fi URL="" FTYPE="" case "${OS}_${ARCH}" in "darwin_arm") URL="https://github.com/JetBrains/qodana-cli/releases/download/$RELEASE/qodana_darwin_arm64.tar.gz" FTYPE=".tar.gz" ;; "darwin_amd64") URL="https://github.com/JetBrains/qodana-cli/releases/download/$RELEASE/qodana_darwin_x86_64.tar.gz" FTYPE=".tar.gz" ;; "linux_arm") URL="https://github.com/JetBrains/qodana-cli/releases/download/$RELEASE/qodana_linux_arm64.tar.gz" FTYPE=".tar.gz" ;; "linux_amd64") URL="https://github.com/JetBrains/qodana-cli/releases/download/$RELEASE/qodana_linux_x86_64.tar.gz" FTYPE=".tar.gz" ;; *) fail "No asset for platform ${OS}-${ARCH}";; esac #got URL! download it... echo -e "\033[0;90m\nInstalling $PROG ($RELEASE) from $URL ... \033[0\n" #enter tempdir mkdir -p $TMP_DIR cd $TMP_DIR || exit if [[ $FTYPE = ".gz" ]]; then which gzip > /dev/null || fail "gzip is not installed" #gz download! bash -c "$GET $URL" | gzip -d - > $PROG || fail "download failed" elif [[ $FTYPE = ".tar.gz" ]] || [[ $FTYPE = ".tgz" ]]; then #check if archiver progs installed which tar > /dev/null || fail "tar is not installed" which gzip > /dev/null || fail "gzip is not installed" bash -c "$GET $URL" | tar zxf - > /dev/null || fail "download failed" elif [[ $FTYPE = ".zip" ]]; then which unzip > /dev/null || fail "unzip is not installed" bash -c "$GET $URL" > tmp.zip || fail "download failed" unzip -o -qq tmp.zip || fail "unzip failed" rm tmp.zip || fail "cleanup failed" elif [[ $FTYPE = "" ]]; then bash -c "$GET $URL" > "qodana_${OS}_${ARCH}" || fail "download failed" else fail "unknown file type: $FTYPE" fi TMP_BIN=$(find . -type f | xargs du | sort -n | tail -n 1 | cut -f 2) if [ ! -f "$TMP_BIN" ]; then fail "could not find find binary (largest file)" fi if [[ $(du -m "$TMP_BIN" | cut -f1) -lt 1 ]]; then fail "no binary found ($TMP_BIN is not larger than 1MB)" fi chmod +x "$TMP_BIN" || fail "chmod +x failed" mv "$TMP_BIN" "$OUT_DIR"/$PROG || fail "mv failed" #FINAL STEP! echo -e "$ qodana --help " && "$OUT_DIR/$PROG" --help echo -e "${check_mark} Installed at $OUT_DIR/$PROG" cleanup header "Next steps\n" echo -e "‣ \033[1mInitialize Qodana in a project\033[0m" echo -e " \033[0;90m\033[0;33mcd\033[0;90m to the project you want to set up Qodana with and run \033[0;33mqodana init\033[0;90m\033[0m\n" echo -e "‣ \033[1mGet help and share your feedback\033[0m" echo -e " \033[0;90mJoin the Qodana community at \033[0;4mhttps://jb.gg/qodana-forum\033[0m" } install