|
| 1 | +#!/bin/sh |
| 2 | +set -eu |
| 3 | + |
| 4 | +REPO="${REPO:-Gladium-AI/flare-edge-cli}" |
| 5 | +BINARY="${BINARY:-flare-edge-cli}" |
| 6 | + |
| 7 | +resolve_install_dir() { |
| 8 | + if [ -n "${INSTALL_DIR:-}" ]; then |
| 9 | + printf '%s\n' "${INSTALL_DIR}" |
| 10 | + return |
| 11 | + fi |
| 12 | + |
| 13 | + if [ -n "${XDG_BIN_HOME:-}" ]; then |
| 14 | + printf '%s\n' "${XDG_BIN_HOME}" |
| 15 | + return |
| 16 | + fi |
| 17 | + |
| 18 | + if [ -d "${HOME}/.local/bin" ]; then |
| 19 | + printf '%s\n' "${HOME}/.local/bin" |
| 20 | + return |
| 21 | + fi |
| 22 | + |
| 23 | + if [ -d "${HOME}/bin" ]; then |
| 24 | + printf '%s\n' "${HOME}/bin" |
| 25 | + return |
| 26 | + fi |
| 27 | + |
| 28 | + printf '%s\n' "${HOME}/.local/bin" |
| 29 | +} |
| 30 | + |
| 31 | +detect_platform() { |
| 32 | + case "$(uname -s)" in |
| 33 | + Linux*) |
| 34 | + GOOS="linux" |
| 35 | + ;; |
| 36 | + Darwin*) |
| 37 | + GOOS="darwin" |
| 38 | + ;; |
| 39 | + *) |
| 40 | + echo "Unsupported OS: $(uname -s)" >&2 |
| 41 | + exit 1 |
| 42 | + ;; |
| 43 | + esac |
| 44 | + |
| 45 | + case "$(uname -m)" in |
| 46 | + x86_64|amd64) |
| 47 | + GOARCH="amd64" |
| 48 | + ;; |
| 49 | + arm64|aarch64) |
| 50 | + GOARCH="arm64" |
| 51 | + ;; |
| 52 | + *) |
| 53 | + echo "Unsupported architecture: $(uname -m)" >&2 |
| 54 | + exit 1 |
| 55 | + ;; |
| 56 | + esac |
| 57 | +} |
| 58 | + |
| 59 | +fetch_latest_tag() { |
| 60 | + api_url="https://api.github.com/repos/${REPO}/releases/latest" |
| 61 | + |
| 62 | + if command -v curl >/dev/null 2>&1; then |
| 63 | + curl -fsSL "${api_url}" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | head -n 1 |
| 64 | + return |
| 65 | + fi |
| 66 | + |
| 67 | + if command -v wget >/dev/null 2>&1; then |
| 68 | + wget -qO- "${api_url}" | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | head -n 1 |
| 69 | + return |
| 70 | + fi |
| 71 | + |
| 72 | + echo "Error: curl or wget is required" >&2 |
| 73 | + exit 1 |
| 74 | +} |
| 75 | + |
| 76 | +download_archive() { |
| 77 | + url="$1" |
| 78 | + out="$2" |
| 79 | + |
| 80 | + if command -v curl >/dev/null 2>&1; then |
| 81 | + curl -fsSL "${url}" -o "${out}" |
| 82 | + return |
| 83 | + fi |
| 84 | + |
| 85 | + wget -q "${url}" -O "${out}" |
| 86 | +} |
| 87 | + |
| 88 | +INSTALL_DIR="$(resolve_install_dir)" |
| 89 | +detect_platform |
| 90 | + |
| 91 | +echo "Detected platform: ${GOOS}/${GOARCH}" |
| 92 | + |
| 93 | +TAG="${TAG:-$(fetch_latest_tag)}" |
| 94 | +if [ -z "${TAG}" ]; then |
| 95 | + echo "Error: could not determine latest release tag" >&2 |
| 96 | + exit 1 |
| 97 | +fi |
| 98 | + |
| 99 | +ARCHIVE="${BINARY}_${TAG}_${GOOS}_${GOARCH}.tar.gz" |
| 100 | +URL="https://github.com/${REPO}/releases/download/${TAG}/${ARCHIVE}" |
| 101 | +TMPDIR="$(mktemp -d)" |
| 102 | +trap 'rm -rf "${TMPDIR}"' EXIT INT TERM |
| 103 | + |
| 104 | +echo "Latest release: ${TAG}" |
| 105 | +echo "Downloading ${URL}" |
| 106 | +download_archive "${URL}" "${TMPDIR}/${ARCHIVE}" |
| 107 | + |
| 108 | +tar -xzf "${TMPDIR}/${ARCHIVE}" -C "${TMPDIR}" |
| 109 | +EXTRACTED_DIR="${TMPDIR}/${BINARY}_${TAG}_${GOOS}_${GOARCH}" |
| 110 | + |
| 111 | +mkdir -p "${INSTALL_DIR}" |
| 112 | +install -m 0755 "${EXTRACTED_DIR}/${BINARY}" "${INSTALL_DIR}/${BINARY}" |
| 113 | + |
| 114 | +echo "Installed ${BINARY} ${TAG} to ${INSTALL_DIR}/${BINARY}" |
| 115 | + |
| 116 | +case ":${PATH}:" in |
| 117 | + *":${INSTALL_DIR}:"*) |
| 118 | + ;; |
| 119 | + *) |
| 120 | + echo |
| 121 | + echo "Add ${INSTALL_DIR} to your PATH:" |
| 122 | + echo " export PATH=\"${INSTALL_DIR}:\$PATH\"" |
| 123 | + ;; |
| 124 | +esac |
0 commit comments