blob: 81c583ac1288a3a7c65be13c6716697ef3c2b901 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#!/bin/sh
set -eu
BIN="herdr"
MANIFEST_URL="https://herdr.dev/latest.json"
INSTALL_DIR="${HERDR_INSTALL_DIR:-$HOME/.local/bin}"
main() {
echo ""
echo " ,ww"
echo " wWWWWWWW_) herdr installer"
echo " \`WWWWWW' herdr.dev"
echo " II II"
echo ""
# detect platform
OS="$(uname -s)"
case "$OS" in
Linux) os="linux" ;;
Darwin) os="macos" ;;
*) err "unsupported OS: $OS" ;;
esac
ARCH="$(uname -m)"
case "$ARCH" in
x86_64|amd64) arch="x86_64" ;;
aarch64|arm64) arch="aarch64" ;;
*) err "unsupported architecture: $ARCH" ;;
esac
log "detected ${os}/${arch}"
# check dependencies
need curl
need awk
# use the same manifest as `herdr update` so installs and updates agree
# on the public latest release.
TARGET="${os}-${arch}"
log "fetching latest release manifest..."
MANIFEST="$(curl -fsSL --retry 3 --connect-timeout 10 --max-time 20 "$MANIFEST_URL")" \
|| err "can't reach ${MANIFEST_URL}. Please try again later; herdr.dev might be down. Who let the sheeps out? baaa."
URL="$(printf '%s\n' "$MANIFEST" | awk -v target="\"${TARGET}\"" '
/^[[:space:]]*"assets"[[:space:]]*:/ { in_assets = 1; next }
in_assets && /^[[:space:]]*}/ { exit }
in_assets && index($0, target) {
sub(/^.*:[[:space:]]*"/, "")
sub(/".*$/, "")
print
exit
}
')"
VERSION="$(printf '%s\n' "$MANIFEST" | awk -F '"' '/^[[:space:]]*"version"[[:space:]]*:/ { print $4; exit }')"
if [ -z "$URL" ]; then
err "release manifest does not include a binary for ${TARGET}"
fi
if [ -n "$VERSION" ]; then
log "downloading v${VERSION}..."
else
log "downloading latest release..."
fi
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
if ! curl -fsSL --retry 3 --connect-timeout 10 --max-time 120 "$URL" -o "${TMP}/${BIN}"; then
err "download failed from ${URL}"
fi
# install
mkdir -p "$INSTALL_DIR"
mv "${TMP}/${BIN}" "${INSTALL_DIR}/${BIN}"
chmod +x "${INSTALL_DIR}/${BIN}"
log "installed ${BIN} to ${INSTALL_DIR}/${BIN}"
# check PATH
case ":${PATH}:" in
*":${INSTALL_DIR}:"*) ;;
*)
echo ""
warn "${INSTALL_DIR} is not in your PATH"
echo " add it to your shell config:"
echo ""
echo " export PATH=\"${INSTALL_DIR}:\$PATH\""
echo ""
;;
esac
# verify
if command -v "$BIN" >/dev/null 2>&1; then
echo ""
log "ready. run 'herdr' to get started."
fi
echo ""
}
log() { printf ' \033[32m>\033[0m %s\n' "$1"; }
warn() { printf ' \033[33m!\033[0m %s\n' "$1"; }
err() { printf ' \033[31m✗\033[0m %s\n' "$1" >&2; exit 1; }
need() {
if ! command -v "$1" >/dev/null 2>&1; then
err "requires '$1' — install it first, or download a binary manually from https://herdr.dev/docs/install/"
fi
}
main "$@"
|