From e715106e05ff2bb5d4f108be8bbdbc727cc50ee0 Mon Sep 17 00:00:00 2001 From: "Max P." Date: Fri, 27 Jun 2025 21:33:15 +0200 Subject: [PATCH] feat(script): add installer for git-cliff binary - Introduce a bash script to install the git-cliff binary - Support fetching the latest or specific versions from GitHub - Ensure compatibility with x86_64 Linux systems - Validate required tools and handle installation errors --- install-git-cliff.sh | 82 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 install-git-cliff.sh diff --git a/install-git-cliff.sh b/install-git-cliff.sh new file mode 100644 index 0000000..c00898a --- /dev/null +++ b/install-git-cliff.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +# install-git-cliff.sh – fetches the latest or specified git-cliff binary (x86_64) +# Usage: sudo ./install-git-cliff.sh # latest version +# sudo ./install-git-cliff.sh 2.9.0 # specific version +# sudo ./install-git-cliff.sh -h # help +set -euo pipefail + +REPO="orhun/git-cliff" +ARCH_OS="x86_64-unknown-linux-gnu" +INSTALL_DIR="/usr/local/bin" +VERSION="${1:-latest}" + +# 0 Handle -h/--help option +if [[ "$VERSION" == "-h" || "$VERSION" == "--help" ]]; then + cat < + Install a specific version (e.g. 2.9.0) + + sudo ./install-git-cliff.sh -h | --help + Show this help message + +This script downloads the appropriate release archive from GitHub, +extracts it, and installs the 'git-cliff' binary to ${INSTALL_DIR}. +EOF + exit 0 +fi + +# 1 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 + +# 2 Determine version → Fetch release JSON +if [[ "$VERSION" == "latest" ]]; then + API_URL="https://api.github.com/repos/${REPO}/releases/latest" +else + API_URL="https://api.github.com/repos/${REPO}/releases/tags/v${VERSION}" +fi + +echo "🔍 Fetching release info ($API_URL)…" +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 +} + +ASSET_URL=$(jq -r '.assets[]?.browser_download_url' <<< "$JSON" | + grep "${ARCH_OS}\.tar" | head -n1) + +if [[ -z "$ASSET_URL" ]]; then + echo "❌ Matching asset not found for architecture ${ARCH_OS}" + exit 1 +fi + +ASSET_FILE=$(basename "$ASSET_URL") +echo "📦 Downloading git-cliff v${VERSION} (${ASSET_FILE}) …" +TMP=$(mktemp -d) +curl -#L -o "${TMP}/${ASSET_FILE}" "$ASSET_URL" + +# 3 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 ;; +esac + +# 4 Locate and 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; } + +sudo install -m755 "$BIN_PATH" "${INSTALL_DIR}/git-cliff" +echo "✅ git-cliff $(git-cliff --version) installed in ${INSTALL_DIR}"