#!/bin/sh set -eu DEFAULT_RELEASE_URL="https://cheesedanish.nickmeslovich.com" if [ -f "$0" ]; then SOURCE_DIR=$(cd "$(dirname "$0")" 2>/dev/null && pwd) if [ -s "$SOURCE_DIR/lib/release-url" ]; then IFS= read -r DEFAULT_RELEASE_URL < "$SOURCE_DIR/lib/release-url" fi fi RELEASE_URL=${CHEESEDANISH_RELEASE_URL:-$DEFAULT_RELEASE_URL} RELEASE_URL=${RELEASE_URL%/} CURL_BIN=${CHEESEDANISH_CURL:-curl} if [ -z "${PREFIX:-}" ]; then PREFIX=${HOME:?HOME is not set}/.local fi BIN_DIR="$PREFIX/bin" LIB_DIR="$PREFIX/lib/cheesedanish" TEMP_BASE=${TMPDIR:-/tmp} TEMP_DIR=$(mktemp -d "$TEMP_BASE/cheesedanish-install.XXXXXX") || exit 1 cleanup() { rm -rf "$TEMP_DIR" } trap cleanup EXIT trap 'exit 129' HUP trap 'exit 130' INT trap 'exit 143' TERM case "$RELEASE_URL" in http://*|https://*) ;; *) printf 'cheesedanish installer: release URL must start with http:// or https://\n' >&2; exit 1 ;; esac command -v "$CURL_BIN" >/dev/null 2>&1 || { printf 'cheesedanish installer: curl is required\n' >&2 exit 1 } if command -v sha256sum >/dev/null 2>&1; then SHA256_TOOL=sha256sum elif command -v shasum >/dev/null 2>&1; then SHA256_TOOL=shasum elif command -v sha256 >/dev/null 2>&1; then SHA256_TOOL=sha256 else printf 'cheesedanish installer: sha256sum, shasum, or sha256 is required\n' >&2 exit 1 fi verify_checksums() { case "$SHA256_TOOL" in sha256sum) sha256sum -c SHA256SUMS ;; shasum) shasum -a 256 -c SHA256SUMS ;; sha256) failed=0 while IFS= read -r line || [ -n "$line" ]; do case "$line" in ''|'#'*) continue ;; esac hash=${line%% *} file=${line#"$hash"} while [ "$file" != "${file# }" ]; do file=${file# } done case "$file" in \*) file=${file#?} ;; esac actual=$(sha256 -q "$file") if [ "$actual" = "$hash" ]; then printf '%s: OK\n' "$file" else printf '%s: FAILED\n' "$file" >&2 failed=1 fi done < SHA256SUMS [ "$failed" -eq 0 ] ;; esac } download() { destination=$1 path=$2 "$CURL_BIN" --fail --silent --show-error --location \ --connect-timeout 30 --max-time 300 \ --output "$destination" "$RELEASE_URL/$path" } mkdir -p "$TEMP_DIR/lib" download "$TEMP_DIR/SHA256SUMS" latest/SHA256SUMS download "$TEMP_DIR/cheesedanish" latest/cheesedanish download "$TEMP_DIR/lib/json.awk" latest/lib/json.awk download "$TEMP_DIR/lib/quote-bytes.awk" latest/lib/quote-bytes.awk download "$TEMP_DIR/lib/replace.awk" latest/lib/replace.awk download "$TEMP_DIR/lib/sse.awk" latest/lib/sse.awk download "$TEMP_DIR/release-url" latest/release-url ( cd "$TEMP_DIR" verify_checksums ) || { printf 'cheesedanish installer: release checksum verification failed\n' >&2 exit 1 } mkdir -p "$BIN_DIR" "$LIB_DIR" cp "$TEMP_DIR/cheesedanish" "$BIN_DIR/cheesedanish" cp "$TEMP_DIR/lib/json.awk" "$LIB_DIR/json.awk" cp "$TEMP_DIR/lib/quote-bytes.awk" "$LIB_DIR/quote-bytes.awk" cp "$TEMP_DIR/lib/replace.awk" "$LIB_DIR/replace.awk" cp "$TEMP_DIR/lib/sse.awk" "$LIB_DIR/sse.awk" cp "$TEMP_DIR/release-url" "$LIB_DIR/release-url" chmod 755 "$BIN_DIR/cheesedanish" chmod 644 "$LIB_DIR/json.awk" "$LIB_DIR/quote-bytes.awk" "$LIB_DIR/replace.awk" "$LIB_DIR/sse.awk" "$LIB_DIR/release-url" version=$(sed -n 's/^CHEESEDANISH_VERSION="\([^"]*\)"/\1/p' "$TEMP_DIR/cheesedanish") printf 'Installed cheesedanish %s in %s\n' "${version:-unknown}" "$BIN_DIR" case ":${PATH:-}:" in *":$BIN_DIR:"*) ;; *) printf 'Add %s to PATH. For example:\n export PATH="%s:$PATH"\n' "$BIN_DIR" "$BIN_DIR" ;; esac