#!/bin/bash # Install review-bot from latest Gitea release # Usage: curl -sSfL https://gitea.weiker.me/rodin/review-bot/raw/branch/main/install.sh | bash set -euo pipefail GITEA_URL="${GITEA_URL:-https://gitea.weiker.me}" REPO="rodin/review-bot" INSTALL_DIR="${INSTALL_DIR:-}" # Determine install directory with fallback if [ -z "$INSTALL_DIR" ]; then if [ -w /usr/local/bin ]; then INSTALL_DIR="/usr/local/bin" else INSTALL_DIR="${HOME}/.local/bin" mkdir -p "$INSTALL_DIR" echo "Note: Installing to $INSTALL_DIR (add to PATH if needed)" fi fi OS=$(uname -s | tr '[:upper:]' '[:lower:]') ARCH=$(uname -m) case "$ARCH" in x86_64) ARCH="amd64" ;; aarch64|arm64) ARCH="arm64" ;; *) echo "Unsupported architecture: $ARCH" >&2; exit 1 ;; esac BINARY="review-bot-${OS}-${ARCH}" # Get latest release tag (POSIX-safe parsing without jq) LATEST=$(curl -sSf "${GITEA_URL}/api/v1/repos/${REPO}/releases?limit=1" | sed -n 's/.*"tag_name":"\([^"]*\)".*/\1/p' | head -1) if [ -z "$LATEST" ]; then echo "Failed to determine latest release" >&2 exit 1 fi echo "Installing review-bot ${LATEST} (${OS}/${ARCH})..." DOWNLOAD_URL="${GITEA_URL}/${REPO}/releases/download/${LATEST}/${BINARY}" CHECKSUM_URL="${GITEA_URL}/${REPO}/releases/download/${LATEST}/checksums.txt" # Download binary and checksums TMPDIR=$(mktemp -d) trap 'rm -rf "$TMPDIR"' EXIT curl -sSfL -o "${TMPDIR}/${BINARY}" "$DOWNLOAD_URL" curl -sSfL -o "${TMPDIR}/checksums.txt" "$CHECKSUM_URL" # Verify checksum cd "$TMPDIR" EXPECTED=$(grep "${BINARY}" checksums.txt | awk '{print $1}') ACTUAL=$(sha256sum "${BINARY}" | awk '{print $1}') if [ -z "$EXPECTED" ]; then echo "Error: no checksum found for ${BINARY} in checksums.txt" >&2 exit 1 fi if [ "$EXPECTED" != "$ACTUAL" ]; then echo "Error: checksum mismatch!" >&2 echo " Expected: $EXPECTED" >&2 echo " Actual: $ACTUAL" >&2 exit 1 fi echo "Checksum verified ✓" # Install cp "${TMPDIR}/${BINARY}" "${INSTALL_DIR}/review-bot" chmod +x "${INSTALL_DIR}/review-bot" echo "Installed review-bot ${LATEST} to ${INSTALL_DIR}/review-bot"