From 2a2ad79bb4990c1f14324180275814a274376970 Mon Sep 17 00:00:00 2001 From: "Max P." Date: Sat, 13 Dec 2025 16:43:19 +0100 Subject: [PATCH] chore(scripts): improve install script readability and error handling --- scripts/install-git-cliff.sh | 91 +++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 22 deletions(-) diff --git a/scripts/install-git-cliff.sh b/scripts/install-git-cliff.sh index bb640b7..556b6b1 100755 --- a/scripts/install-git-cliff.sh +++ b/scripts/install-git-cliff.sh @@ -31,7 +31,7 @@ REPO="orhun/git-cliff" # ─────────────────────────────────────────────── # Defaults (internal vs. user-facing) ARCH_OS_DEFAULT="x86_64-unknown-linux-gnu" -DEFAULT_ARCH_DISPLAY="${ARCH_OS_DEFAULT/-unknown-/}" # shown to user → x86_64-linux-gnu +DEFAULT_ARCH_DISPLAY="${ARCH_OS_DEFAULT/-unknown-/}" # shown to user → x86_64-linux-gnu INSTALL_DIR_DEFAULT="/usr/local/bin" ARCH_OS="$ARCH_OS_DEFAULT" INSTALL_DIR="$INSTALL_DIR_DEFAULT" @@ -54,15 +54,34 @@ show_help() { POSITIONAL=() while [[ $# -gt 0 ]]; do case "$1" in - -h|--help) show_help; exit 0 ;; - -n|--dry-run) DRY_RUN=true; shift ;; - -a|--arch) - [[ $# -lt 2 ]] && { echo "❌ Option $1 requires an argument"; exit 1; } - ARCH_OS_INPUT="$2"; shift 2 ;; - -d|--dir) - [[ $# -lt 2 ]] && { echo "❌ Option $1 requires an argument"; exit 1; } - INSTALL_DIR="$2"; shift 2 ;; - *) POSITIONAL+=("$1"); shift ;; + -h | --help) + show_help + exit 0 + ;; + -n | --dry-run) + DRY_RUN=true + shift + ;; + -a | --arch) + [[ $# -lt 2 ]] && { + echo "❌ Option $1 requires an argument" + exit 1 + } + ARCH_OS_INPUT="$2" + shift 2 + ;; + -d | --dir) + [[ $# -lt 2 ]] && { + echo "❌ Option $1 requires an argument" + exit 1 + } + INSTALL_DIR="$2" + shift 2 + ;; + *) + POSITIONAL+=("$1") + shift + ;; esac done if [[ ${#POSITIONAL[@]} -gt 0 ]]; then @@ -98,8 +117,16 @@ if command -v git-cliff >/dev/null; then fi # 4 Check for required tools -need() { command -v "$1" >/dev/null || { echo "$1 is missing"; exit 1; }; } -need curl; need tar; need grep; need sed; need awk; need jq +need() { command -v "$1" >/dev/null || { + echo "$1 is missing" + exit 1 +}; } +need curl +need tar +need grep +need sed +need awk +need jq # 5 Determine version → Fetch release JSON if [[ "$VERSION" == "latest" ]]; then @@ -109,14 +136,23 @@ else fi echo "🔍 Fetching release info ($API_URL)…" -JSON=$(curl -fsSL "$API_URL") || { echo "❌ Failed to fetch release info"; exit 1; } +JSON=$(curl -fsSL "$API_URL") || { + echo "❌ Failed to fetch release info" + exit 1 +} -VERSION=$(jq -r '.tag_name' <<< "$JSON") || { echo "❌ Could not extract version"; exit 1; } +VERSION=$(jq -r '.tag_name' <<<"$JSON") || { + echo "❌ Could not extract version" + exit 1 +} -ASSET_URL=$(jq -r '.assets[]?.browser_download_url' <<< "$JSON" | +ASSET_URL=$(jq -r '.assets[]?.browser_download_url' <<<"$JSON" | grep -E "${ARCH_OS}\.(tar\.(gz|xz)|zip)$" | head -n1) -[[ -z "$ASSET_URL" ]] && { echo "❌ Matching asset not found for architecture ${ARCH_OS}"; exit 1; } +[[ -z "$ASSET_URL" ]] && { + echo "❌ Matching asset not found for architecture ${ARCH_OS}" + exit 1 +} ASSET_FILE=$(basename "$ASSET_URL") echo "📦 Downloading git-cliff ${VERSION} (${ASSET_FILE}) …" @@ -125,21 +161,32 @@ curl -#L -o "${TMP}/${ASSET_FILE}" "$ASSET_URL" # 6 Extract based on file extension case "$ASSET_FILE" in - *.tar.gz|*.tgz) tar -C "$TMP" -xzf "${TMP}/${ASSET_FILE}" ;; - *.tar.xz) tar -C "$TMP" -xJf "${TMP}/${ASSET_FILE}" ;; - *.zip) need unzip; unzip -q "${TMP}/${ASSET_FILE}" -d "$TMP" ;; - *) echo "❌ Unknown archive format: $ASSET_FILE"; exit 1 ;; +*.tar.gz | *.tgz) tar -C "$TMP" -xzf "${TMP}/${ASSET_FILE}" ;; +*.tar.xz) tar -C "$TMP" -xJf "${TMP}/${ASSET_FILE}" ;; +*.zip) + need unzip + unzip -q "${TMP}/${ASSET_FILE}" -d "$TMP" + ;; +*) + echo "❌ Unknown archive format: $ASSET_FILE" + exit 1 + ;; esac # 7 Locate & (maybe) install binary BIN_PATH=$(find "$TMP" -type f -name git-cliff -perm -u+x | head -n1) -[[ -z "$BIN_PATH" ]] && { echo "❌ Binary not found"; exit 1; } +[[ -z "$BIN_PATH" ]] && { + echo "❌ Binary not found" + exit 1 +} if $DRY_RUN; then echo "🧪 Dry-run: verified git-cliff binary at ${BIN_PATH}" echo "ℹ️ Would install to: ${INSTALL_DIR}/git-cliff (sudo install -m755 …)" echo "✅ git-cliff $("$BIN_PATH" --version) would be installed successfully" else - sudo install -m755 "$BIN_PATH" "${INSTALL_DIR}/git-cliff" + SUDO="" + [[ $EUID -eq 0 ]] || SUDO="sudo" + $SUDO install -m755 "$BIN_PATH" "${INSTALL_DIR}/git-cliff" echo "✅ git-cliff $(git-cliff --version) installed in ${INSTALL_DIR}" fi