-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·144 lines (120 loc) · 3.79 KB
/
install.sh
File metadata and controls
executable file
·144 lines (120 loc) · 3.79 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/env bash
set -euo pipefail
REPO="Junnyyy/wt"
BIN_DIR="$HOME/.local/bin"
BIN_PATH="$BIN_DIR/wt"
log() { echo "[wt] $*"; }
err() { echo "[wt] Error: $*" >&2; }
# --- Step 1: Environment detection ---
OS="$(uname -s)"
if [ "$OS" != "Darwin" ]; then
err "Only macOS is supported right now (detected: $OS)"
exit 1
fi
ARCH="$(uname -m)"
case "$ARCH" in
arm64|aarch64) ARCH="arm64" ;;
x86_64) ARCH="x64" ;;
*)
err "Unsupported architecture: $ARCH"
exit 1
;;
esac
BINARY="wt-darwin-${ARCH}"
log "Detected: macOS $ARCH"
# --- Step 2: Classify existing install ---
CURRENT_VERSION=""
INSTALL_TYPE="fresh" # fresh | update | symlink-replace
if [ -L "$BIN_PATH" ]; then
# Symlink — likely a dev install
LINK_TARGET="$(readlink "$BIN_PATH")"
log "Found dev symlink at $BIN_PATH -> $LINK_TARGET"
INSTALL_TYPE="symlink-replace"
elif [ -f "$BIN_PATH" ]; then
# Regular file — likely a previous install
if [ -x "$BIN_PATH" ]; then
CURRENT_VERSION="$("$BIN_PATH" --version 2>/dev/null || echo "")"
if [ -n "$CURRENT_VERSION" ]; then
log "Current install: $CURRENT_VERSION"
INSTALL_TYPE="update"
else
log "Found existing binary at $BIN_PATH (could not detect version)"
INSTALL_TYPE="update"
fi
else
err "$BIN_PATH exists but is not executable."
err "Inspect with: ls -la $BIN_PATH"
err "Remove manually if safe: rm $BIN_PATH"
exit 1
fi
elif [ -e "$BIN_PATH" ]; then
# Something else (directory, socket, etc.)
err "$BIN_PATH exists and is not a regular file or symlink."
err "Inspect with: ls -la $BIN_PATH"
err "Remove manually if safe: rm $BIN_PATH"
exit 1
else
log "No existing install found"
fi
# --- Step 3: Fetch latest release tag (metadata only, no binary download) ---
log "Fetching latest release..."
TAG="$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" \
| grep '"tag_name"' \
| sed -E 's/.*"tag_name": *"([^"]+)".*/\1/' \
| head -1)"
if [ -z "$TAG" ]; then
err "Could not determine latest release tag"
exit 1
fi
# Compare versions — skip download if already up to date
if [ "$INSTALL_TYPE" = "update" ] && [ -n "$CURRENT_VERSION" ]; then
# Normalize: CURRENT_VERSION might be "0.1.3" or "v0.1.3", TAG is "v0.1.3"
CURRENT_NORMALIZED="${CURRENT_VERSION#v}"
TAG_NORMALIZED="${TAG#v}"
if [ "$CURRENT_NORMALIZED" = "$TAG_NORMALIZED" ]; then
log "Already up to date ($TAG)"
exit 0
fi
fi
log "Latest: $TAG"
# --- Step 4: Download binary (only reached if needed) ---
URL="https://github.com/${REPO}/releases/download/${TAG}/${BINARY}"
mkdir -p "$BIN_DIR"
TMPFILE="$(mktemp "${BIN_DIR}/wt.XXXXXX")"
cleanup() { if [ -n "$TMPFILE" ]; then rm -f "$TMPFILE"; fi; }
trap cleanup EXIT
log "Downloading $BINARY..."
if ! curl -fsSL "$URL" -o "$TMPFILE"; then
err "Download failed: $URL"
exit 1
fi
chmod +x "$TMPFILE"
mv -f "$TMPFILE" "$BIN_PATH" # rename(2) atomically replaces symlinks without following
TMPFILE="" # Disarm cleanup trap — binary is installed
# --- Step 5: Confirm and advise ---
INSTALLED_VERSION="$("$BIN_PATH" --version 2>/dev/null || echo "$TAG")"
if [ "$INSTALL_TYPE" = "update" ] && [ -n "$CURRENT_VERSION" ]; then
log "Updated wt: $CURRENT_VERSION -> $INSTALLED_VERSION"
else
log "Installed wt $INSTALLED_VERSION to $BIN_PATH"
fi
# PATH hint
case ":$PATH:" in
*":$BIN_DIR:"*) ;;
*)
log ""
log "Add ~/.local/bin to your PATH:"
log " export PATH=\"\$HOME/.local/bin:\$PATH\""
;;
esac
# Shell integration hint (only for fresh installs, not updates)
if [ "$INSTALL_TYPE" != "update" ]; then
case "$SHELL" in
*/zsh) RC_FILE="~/.zshrc" ;;
*/bash) RC_FILE="~/.bashrc" ;;
*) RC_FILE="your shell's rc file" ;;
esac
log ""
log "Set up shell integration (recommended):"
log " wt shell-init >> $RC_FILE && source $RC_FILE"
fi