Skip to content

Commit 24bb293

Browse files
committed
feat(cli): better install script output
1 parent 4518010 commit 24bb293

File tree

1 file changed

+117
-9
lines changed

1 file changed

+117
-9
lines changed

install

Lines changed: 117 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
set -euo pipefail
33
APP=opencode
44

5+
MUTED='\033[0;2m'
56
RED='\033[0;31m'
6-
GREEN='\033[0;32m'
7-
YELLOW='\033[1;33m'
87
ORANGE='\033[38;2;255;140;0m'
98
NC='\033[0m' # No Color
109

@@ -67,8 +66,8 @@ print_message() {
6766
local color=""
6867

6968
case $level in
70-
info) color="${GREEN}" ;;
71-
warning) color="${YELLOW}" ;;
69+
info) color="${NC}" ;;
70+
warning) color="${NC}" ;;
7271
error) color="${RED}" ;;
7372
esac
7473

@@ -86,18 +85,110 @@ check_version() {
8685
installed_version=$(echo $installed_version | awk '{print $2}')
8786

8887
if [[ "$installed_version" != "$specific_version" ]]; then
89-
print_message info "Installed version: ${YELLOW}$installed_version."
88+
print_message info "${MUTED}Installed version: ${NC}$installed_version."
9089
else
91-
print_message info "Version ${YELLOW}$specific_version${GREEN} already installed"
90+
print_message info "${MUTED}Version ${NC}$specific_version${MUTED} already installed"
9291
exit 0
9392
fi
9493
fi
9594
}
9695

96+
unbuffered_sed() {
97+
if echo | sed -u >/dev/null 2>&1; then
98+
sed -nu "$@"
99+
elif echo | sed -l >/dev/null 2>&1; then
100+
sed -nl "$@"
101+
else
102+
local pad="$(printf "\n%512s" "")"
103+
sed -ne "s/$/\\${pad}/" "$@"
104+
fi
105+
}
106+
107+
print_progress() {
108+
local bytes="$1"
109+
local length="$2"
110+
[ "$length" -gt 0 ] || return 0
111+
112+
local width=50
113+
local percent=$(( bytes * 100 / length ))
114+
[ "$percent" -gt 100 ] && percent=100
115+
local on=$(( percent * width / 100 ))
116+
local off=$(( width - on ))
117+
118+
local full_filled=$(printf "%.0s■" {1..50})
119+
local full_empty=$(printf "%.0s・" {1..50})
120+
121+
printf "\r${ORANGE}%s%s %3d%%${NC}" "${full_filled:0:$on}" "${full_empty:0:$off}" "$percent" >&4
122+
}
123+
124+
download_with_progress() {
125+
local url="$1"
126+
local output="$2"
127+
128+
if [ -t 2 ]; then
129+
exec 4>&2
130+
else
131+
exec 4>/dev/null
132+
fi
133+
134+
local tmp_dir=${TMPDIR:-/tmp}
135+
local basename="${tmp_dir}/opencode_install_$$"
136+
local tracefile="${basename}.trace"
137+
138+
rm -f "$tracefile"
139+
mkfifo "$tracefile"
140+
141+
# Hide cursor
142+
printf "\033[?25l" >&4
143+
144+
trap "trap - RETURN; rm -f \"$tracefile\"; printf '\033[?25h' >&4; exec 4>&-" RETURN
145+
146+
(
147+
curl --trace-ascii "$tracefile" -s -L -o "$output" "$url"
148+
) &
149+
local curl_pid=$!
150+
151+
unbuffered_sed \
152+
-e 'y/ACDEGHLNORTV/acdeghlnortv/' \
153+
-e '/^0000: content-length:/p' \
154+
-e '/^<= recv data/p' \
155+
"$tracefile" | \
156+
{
157+
local length=0
158+
local bytes=0
159+
160+
while IFS=" " read -r -a line; do
161+
local tag="${line[0]} ${line[1]}"
162+
163+
if [ "$tag" = "0000: content-length:" ]; then
164+
length="${line[2]}"
165+
length=$(echo "$length" | tr -d '\r')
166+
bytes=0
167+
elif [ "$tag" = "<= recv" ]; then
168+
local size="${line[3]}"
169+
bytes=$(( bytes + size ))
170+
if [ "$length" -gt 0 ]; then
171+
print_progress "$bytes" "$length"
172+
fi
173+
fi
174+
done
175+
}
176+
177+
wait $curl_pid
178+
local ret=$?
179+
echo "" >&4
180+
return $ret
181+
}
182+
97183
download_and_install() {
98-
print_message info "Downloading ${ORANGE}opencode ${GREEN}version: ${YELLOW}$specific_version ${GREEN}..."
184+
print_message info "\n${MUTED}Installing ${NC}opencode ${MUTED}version: ${NC}$specific_version"
99185
mkdir -p opencodetmp && cd opencodetmp
100-
curl -# -L -o "$filename" "$url"
186+
187+
if ! download_with_progress "$url" "$filename"; then
188+
# Fallback to standard curl if custom fails for some reason
189+
curl -# -L -o "$filename" "$url"
190+
fi
191+
101192
unzip -q "$filename"
102193
mv opencode "$INSTALL_DIR"
103194
chmod 755 "${INSTALL_DIR}/opencode"
@@ -117,7 +208,7 @@ add_to_path() {
117208
elif [[ -w $config_file ]]; then
118209
echo -e "\n# opencode" >> "$config_file"
119210
echo "$command" >> "$config_file"
120-
print_message info "Successfully added ${ORANGE}opencode ${GREEN}to \$PATH in $config_file"
211+
print_message info "${MUTED}Successfully added ${NC}opencode ${MUTED}to \$PATH in ${NC}$config_file"
121212
else
122213
print_message warning "Manually add the directory to $config_file (or similar):"
123214
print_message info " $command"
@@ -191,3 +282,20 @@ if [ -n "${GITHUB_ACTIONS-}" ] && [ "${GITHUB_ACTIONS}" == "true" ]; then
191282
echo "$INSTALL_DIR" >> $GITHUB_PATH
192283
print_message info "Added $INSTALL_DIR to \$GITHUB_PATH"
193284
fi
285+
286+
echo -e ""
287+
echo -e "${MUTED}  ${NC}"
288+
echo -e "${MUTED}█▀▀█ █▀▀█ █▀▀█ █▀▀▄ ${NC}█▀▀▀ █▀▀█ █▀▀█ █▀▀█"
289+
echo -e "${MUTED}█░░█ █░░█ █▀▀▀ █░░█ ${NC}█░░░ █░░█ █░░█ █▀▀▀"
290+
echo -e "${MUTED}▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀ ▀ ${NC}▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀"
291+
echo -e ""
292+
echo -e ""
293+
echo -e "${MUTED}To get started, navigate to a project and run:${NC}"
294+
echo -e "opencode ${MUTED}Use free models${NC}"
295+
echo -e "opencode auth login ${MUTED}Add paid provider API keys${NC}"
296+
echo -e "opencode help ${MUTED}List commands and options${NC}"
297+
echo -e ""
298+
echo -e "${MUTED}For more information visit ${NC}https://opencode.ai/docs"
299+
echo -e ""
300+
echo -e ""
301+

0 commit comments

Comments
 (0)