bd06b4b900
release / release (push) Successful in 40s
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
91 lines
3.1 KiB
Bash
Executable File
91 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# install.sh — download the emcli binary from the project's release assets and
|
|
# put it on your PATH. Detects OS/arch, verifies the checksum when available.
|
|
#
|
|
# Usage:
|
|
# bash install.sh
|
|
#
|
|
# Environment overrides:
|
|
# EMCLI_VERSION release tag to fetch (default: v0.5.0)
|
|
# EMCLI_BASE_URL repo base URL (default: https://gitea.dcglab.co.uk/steve/emcli)
|
|
# EMCLI_INSTALL_DIR where to put the binary (default: $HOME/.local/bin)
|
|
#
|
|
# Release assets follow this naming scheme:
|
|
# emcli_<version>_<os>_<arch>[.exe] e.g. emcli_0.5.0_linux_amd64
|
|
# checksums.txt (sha256, one "<sum> <asset>" line per asset)
|
|
|
|
set -euo pipefail
|
|
|
|
VERSION="${EMCLI_VERSION:-v0.5.0}"
|
|
BASE_URL="${EMCLI_BASE_URL:-https://gitea.dcglab.co.uk/steve/emcli}"
|
|
INSTALL_DIR="${EMCLI_INSTALL_DIR:-$HOME/.local/bin}"
|
|
|
|
die() { printf 'install.sh: %s\n' "$1" >&2; exit 1; }
|
|
|
|
# --- detect OS -------------------------------------------------------------
|
|
case "$(uname -s)" in
|
|
Linux) OS=linux ;;
|
|
Darwin) OS=darwin ;;
|
|
MINGW*|MSYS*|CYGWIN*) OS=windows ;;
|
|
*) die "unsupported OS: $(uname -s)" ;;
|
|
esac
|
|
|
|
# --- detect arch -----------------------------------------------------------
|
|
case "$(uname -m)" in
|
|
x86_64|amd64) ARCH=amd64 ;;
|
|
arm64|aarch64) ARCH=arm64 ;;
|
|
*) die "unsupported architecture: $(uname -m)" ;;
|
|
esac
|
|
|
|
EXT=""
|
|
[ "$OS" = windows ] && EXT=".exe"
|
|
|
|
VER_NO_V="${VERSION#v}"
|
|
ASSET="emcli_${VER_NO_V}_${OS}_${ARCH}${EXT}"
|
|
URL="${BASE_URL}/releases/download/${VERSION}/${ASSET}"
|
|
DEST="${INSTALL_DIR}/emcli${EXT}"
|
|
|
|
# --- pick a downloader -----------------------------------------------------
|
|
download() { # download <url> <dest>
|
|
if command -v curl >/dev/null 2>&1; then
|
|
curl -fSL "$1" -o "$2"
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
wget -qO "$2" "$1"
|
|
else
|
|
die "need curl or wget to download"
|
|
fi
|
|
}
|
|
|
|
mkdir -p "$INSTALL_DIR"
|
|
|
|
printf 'Downloading %s\n from %s\n' "$ASSET" "$URL"
|
|
download "$URL" "$DEST" || die "download failed (is ${VERSION} published yet?)"
|
|
chmod +x "$DEST"
|
|
|
|
# --- verify checksum if a checksums.txt is published -----------------------
|
|
if command -v sha256sum >/dev/null 2>&1; then
|
|
sums="$(mktemp)"
|
|
if download "${BASE_URL}/releases/download/${VERSION}/checksums.txt" "$sums" 2>/dev/null; then
|
|
want="$(awk -v a="$ASSET" '$2 == a || $2 == "*"a {print $1}' "$sums" | head -n1)"
|
|
if [ -n "$want" ]; then
|
|
got="$(sha256sum "$DEST" | awk '{print $1}')"
|
|
[ "$want" = "$got" ] || die "checksum mismatch for ${ASSET} (expected ${want}, got ${got})"
|
|
echo "checksum ok"
|
|
fi
|
|
fi
|
|
rm -f "$sums"
|
|
fi
|
|
|
|
printf 'Installed emcli to %s\n' "$DEST"
|
|
|
|
# --- PATH hint -------------------------------------------------------------
|
|
case ":$PATH:" in
|
|
*":$INSTALL_DIR:"*) ;;
|
|
*) printf 'Note: %s is not on your PATH. Add it, e.g.:\n export PATH="%s:$PATH"\n' "$INSTALL_DIR" "$INSTALL_DIR" ;;
|
|
esac
|
|
|
|
# --- confirm it runs -------------------------------------------------------
|
|
"$DEST" version || die "binary downloaded but failed to run"
|
|
echo "Done. Remember: emcli needs EMCLI_KEY set in the environment to do anything."
|