[READ-ONLY] Mirror of https://github.com/mrgnw/scripts.
0

Configure Feed

Select the types of activity you want to include in your feed.

add gh-install: install binaries from GitHub releases

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+71
+71
gh-install
··· 1 + #!/usr/bin/env bash 2 + set -euo pipefail 3 + 4 + DEST="${HOME}/.local/bin" 5 + 6 + usage() { 7 + echo "Install a binary from GitHub releases" 8 + echo "" 9 + echo "Usage: gh-install <owner/repo> <asset-pattern> [binary-name]" 10 + echo "" 11 + echo " asset-pattern Glob for the release asset filename (use * for version)" 12 + echo " binary-name Name of the binary inside the archive (default: repo name)" 13 + echo "" 14 + echo "Examples:" 15 + echo " gh-install orf/gping 'gping-*-aarch64-apple-darwin.tar.gz'" 16 + echo " gh-install helix-editor/helix 'helix-*-aarch64-macos.tar.xz' hx" 17 + echo " gh-install Schniz/fnm 'fnm-macos.zip' fnm" 18 + exit 1 19 + } 20 + 21 + [[ $# -lt 2 ]] && usage 22 + 23 + REPO="$1" 24 + PATTERN="$2" 25 + BINARY="${3:-$(basename "$REPO")}" 26 + 27 + VER=$(curl -sI "https://github.com/${REPO}/releases/latest" | grep -i ^location | sed 's|.*/tag/||;s/\r//;s/^v//') 28 + [[ -z "$VER" ]] && echo "Could not detect latest version for ${REPO}" && exit 1 29 + echo "Latest: ${REPO} ${VER}" 30 + 31 + FILENAME="${PATTERN//\*/$VER}" 32 + URL="https://github.com/${REPO}/releases/download/${VER}/${FILENAME}" 33 + 34 + # some repos tag with v prefix 35 + if ! curl -sfIo /dev/null "$URL"; then 36 + URL="https://github.com/${REPO}/releases/download/v${VER}/${FILENAME}" 37 + curl -sfIo /dev/null "$URL" || { echo "Asset not found: ${FILENAME}"; exit 1; } 38 + fi 39 + 40 + echo "Downloading ${FILENAME}" 41 + 42 + TMPDIR=$(mktemp -d) 43 + trap 'rm -rf "$TMPDIR"' EXIT 44 + curl -sL -o "${TMPDIR}/${FILENAME}" "$URL" 45 + 46 + mkdir -p "$DEST" 47 + 48 + case "$FILENAME" in 49 + *.tar.gz|*.tgz) 50 + tar xzf "${TMPDIR}/${FILENAME}" -C "$TMPDIR" 51 + ;; 52 + *.tar.xz) 53 + tar xJf "${TMPDIR}/${FILENAME}" -C "$TMPDIR" 54 + ;; 55 + *.zip) 56 + unzip -o "${TMPDIR}/${FILENAME}" -d "$TMPDIR" >/dev/null 57 + ;; 58 + *) 59 + chmod +x "${TMPDIR}/${FILENAME}" 60 + mv "${TMPDIR}/${FILENAME}" "${DEST}/${BINARY}" 61 + echo "Installed ${BINARY} to ${DEST}/${BINARY}" 62 + exit 0 63 + ;; 64 + esac 65 + 66 + BIN=$(find "$TMPDIR" -name "$BINARY" -type f | head -1) 67 + [[ -z "$BIN" ]] && echo "Could not find '${BINARY}' in archive" && ls -R "$TMPDIR" && exit 1 68 + 69 + chmod +x "$BIN" 70 + mv "$BIN" "${DEST}/${BINARY}" 71 + echo "Installed ${BINARY} to ${DEST}/${BINARY}"