diff --git a/install b/install index b0716d532082..87980d343ff4 100755 --- a/install +++ b/install @@ -234,94 +234,15 @@ check_version() { fi } -unbuffered_sed() { - if echo | sed -u -e "" >/dev/null 2>&1; then - sed -nu "$@" - elif echo | sed -l -e "" >/dev/null 2>&1; then - sed -nl "$@" - else - local pad="$(printf "\n%512s" "")" - sed -ne "s/$/\\${pad}/" "$@" - fi -} - -print_progress() { - local bytes="$1" - local length="$2" - [ "$length" -gt 0 ] || return 0 - - local width=50 - local percent=$(( bytes * 100 / length )) - [ "$percent" -gt 100 ] && percent=100 - local on=$(( percent * width / 100 )) - local off=$(( width - on )) - - local filled=$(printf "%*s" "$on" "") - filled=${filled// /■} - local empty=$(printf "%*s" "$off" "") - empty=${empty// /・} - - printf "\r${ORANGE}%s%s %3d%%${NC}" "$filled" "$empty" "$percent" >&4 -} - -download_with_progress() { +download_file() { local url="$1" local output="$2" if [ -t 2 ]; then - exec 4>&2 + curl --fail --location --progress-bar --output "$output" "$url" else - exec 4>/dev/null + curl --fail --location --silent --show-error --output "$output" "$url" fi - - local tmp_dir=${TMPDIR:-/tmp} - local basename="${tmp_dir}/opencode_install_$$" - local tracefile="${basename}.trace" - - rm -f "$tracefile" - mkfifo "$tracefile" - - # Hide cursor - printf "\033[?25l" >&4 - - trap "trap - RETURN; rm -f \"$tracefile\"; printf '\033[?25h' >&4; exec 4>&-" RETURN - - ( - curl --trace-ascii "$tracefile" -s -L -o "$output" "$url" - ) & - local curl_pid=$! - - unbuffered_sed \ - -e 'y/ACDEGHLNORTV/acdeghlnortv/' \ - -e '/^0000: content-length:/p' \ - -e '/^<= recv data/p' \ - "$tracefile" | \ - { - local length=0 - local bytes=0 - - while IFS=" " read -r -a line; do - [ "${#line[@]}" -lt 2 ] && continue - local tag="${line[0]} ${line[1]}" - - if [ "$tag" = "0000: content-length:" ]; then - length="${line[2]}" - length=$(echo "$length" | tr -d '\r') - bytes=0 - elif [ "$tag" = "<= recv" ]; then - local size="${line[3]}" - bytes=$(( bytes + size )) - if [ "$length" -gt 0 ]; then - print_progress "$bytes" "$length" - fi - fi - done - } - - wait $curl_pid - local ret=$? - echo "" >&4 - return $ret } download_and_install() { @@ -329,10 +250,7 @@ download_and_install() { local tmp_dir="${TMPDIR:-/tmp}/opencode_install_$$" mkdir -p "$tmp_dir" - if [[ "$os" == "windows" ]] || ! [ -t 2 ] || ! download_with_progress "$url" "$tmp_dir/$filename"; then - # Fallback to standard curl on Windows, non-TTY environments, or if custom progress fails - curl -# -L -o "$tmp_dir/$filename" "$url" - fi + download_file "$url" "$tmp_dir/$filename" if [ "$os" = "linux" ]; then tar -xzf "$tmp_dir/$filename" -C "$tmp_dir"