diff --git a/installers/install_asciicinema.sh b/installers/install_asciicinema.sh index 1346bb8..fccc014 100644 --- a/installers/install_asciicinema.sh +++ b/installers/install_asciicinema.sh @@ -21,12 +21,9 @@ cleanup() { trap cleanup EXIT install_asciicinema() { - local latest_tag="" if has_command curl; then log_info "Fetching latest asciinema version from GitHub..." - latest_tag=$(curl -sL https://api.github.com/repos/asciinema/asciinema/releases/latest \ - | grep '"tag_name":' | head -n1 \ - | sed -E 's/.*"tag_name": "([^"]+)".*/\1/' || true) + latest_tag=$(github_get_latest_release "asciinema/asciinema") fi if [ -z "$latest_tag" ]; then @@ -73,10 +70,8 @@ install_asciicinema() { *) log_error "Unsupported architecture: $arch"; exit 1 ;; esac - local download_url="https://github.com/asciinema/asciinema/releases/download/${latest_tag}/asciinema-${asciinema_arch}" - log_info "Downloading asciinema ${latest_tag} for ${arch}..." - download_file "$download_url" "$TMP_DIR/asciinema" + github_download_asset "asciinema/asciinema" "$latest_tag" "asciinema-${asciinema_arch}" "$TMP_DIR/asciinema" log_info "Installing asciinema to /usr/local/bin..." sudo cp "$TMP_DIR/asciinema" /usr/local/bin/asciinema diff --git a/installers/install_bat.sh b/installers/install_bat.sh index 8fe6ccf..843e7d2 100644 --- a/installers/install_bat.sh +++ b/installers/install_bat.sh @@ -41,7 +41,7 @@ install_bat() { log_info "Fetching latest Bat version from GitHub..." local latest_tag="" - latest_tag=$(curl -sL https://api.github.com/repos/sharkdp/bat/releases/latest | grep '"tag_name":' | head -n1 | sed -E 's/.*"tag_name": "([^"]+)".*/\1/' || true) + latest_tag=$(github_get_latest_release "sharkdp/bat") if [ -z "$latest_tag" ]; then latest_tag="v0.26.1" @@ -61,9 +61,8 @@ install_bat() { deb_arch="arm64" fi - local deb_url="https://github.com/sharkdp/bat/releases/download/${latest_tag}/bat_${version}_${deb_arch}.deb" - log_info "Downloading Bat from ${deb_url}..." - download_file "$deb_url" "$TMP_DIR/bat.deb" + log_info "Downloading Bat ${latest_tag}..." + github_download_asset "sharkdp/bat" "$latest_tag" "bat_${version}_${deb_arch}\.deb" "$TMP_DIR/bat.deb" log_info "Installing Bat package..." sudo apt install -y "$TMP_DIR/bat.deb" diff --git a/installers/install_node.sh b/installers/install_node.sh index bfdce16..a3198cf 100644 --- a/installers/install_node.sh +++ b/installers/install_node.sh @@ -34,7 +34,7 @@ install_nvm() { # Try to fetch the latest version of NVM from GitHub API log_info "Fetching the latest NVM version..." local latest_tag="" - latest_tag=$(curl -sL https://api.github.com/repos/nvm-sh/nvm/releases/latest | grep '"tag_name":' | head -n1 | sed -E 's/.*"tag_name": "([^"]+)".*/\1/' || true) + latest_tag=$(github_get_latest_release "nvm-sh/nvm") if [ -z "$latest_tag" ]; then latest_tag="v0.40.5" # Fallback version if API request fails diff --git a/installers/install_nvim.sh b/installers/install_nvim.sh index c5e4c08..773d5c4 100644 --- a/installers/install_nvim.sh +++ b/installers/install_nvim.sh @@ -76,10 +76,8 @@ install_nvim() { *) log_error "Unsupported architecture: $arch"; exit 1 ;; esac - local nvim_url="https://github.com/neovim/neovim/releases/download/v${NVIM_VERSION}/nvim-${nvim_arch}.tar.gz" - log_info "Downloading Neovim v${NVIM_VERSION} for ${arch}..." - download_file "$nvim_url" "$TMP_DIR/nvim.tar.gz" + github_download_asset "neovim/neovim" "v${NVIM_VERSION}" "nvim-${nvim_arch}\.tar\.gz" "$TMP_DIR/nvim.tar.gz" tar -xzf "$TMP_DIR/nvim.tar.gz" -C "$TMP_DIR" diff --git a/installers/install_pnpm.sh b/installers/install_pnpm.sh index 46f8c2b..5053305 100644 --- a/installers/install_pnpm.sh +++ b/installers/install_pnpm.sh @@ -127,14 +127,17 @@ install_pnpm() { } libc_suffix="$(detect_libc_suffix)" - # Fetch the latest version from the npm registry, or use PNPM_VERSION if set + # Fetch the latest version from GitHub, or use PNPM_VERSION if set if [ -z "${PNPM_VERSION:-}" ]; then - log_info "Fetching latest pnpm version from npm registry..." - version_json="$(download "https://registry.npmjs.org/@pnpm/exe")" || { - log_error "Failed to fetch pnpm version info from npm registry." + log_info "Fetching latest pnpm version from GitHub..." + local tag + tag=$(github_get_latest_release "pnpm/pnpm") + if [ -n "$tag" ]; then + version="${tag#v}" + else + log_error "Failed to fetch pnpm version info from GitHub." return 1 - } - version="$(echo "$version_json" | grep -o '"latest":[[:space:]]*"[0-9.]*"' | grep -o '[0-9.]*')" + fi else version="${PNPM_VERSION}" fi @@ -151,7 +154,7 @@ install_pnpm() { if [ "$major_version" -ge 11 ]; then # v11+: distributed as tarballs containing the binary and dist/ directory - download "https://github.com/pnpm/pnpm/releases/download/v${version}/${asset_base}.tar.gz" "$TMP_DIR/pnpm.tar.gz" || { + github_download_asset "pnpm/pnpm" "v${version}" "${asset_base}\.tar\.gz" "$TMP_DIR/pnpm.tar.gz" || { log_error "Failed to download pnpm tarball." return 1 } @@ -166,7 +169,7 @@ install_pnpm() { } else # Older versions: distributed as a single executable binary - download "https://github.com/pnpm/pnpm/releases/download/v${version}/${asset_base}" "$TMP_DIR/pnpm" || { + github_download_asset "pnpm/pnpm" "v${version}" "${asset_base}" "$TMP_DIR/pnpm" || { log_error "Failed to download pnpm binary." return 1 } diff --git a/installers/install_starship.sh b/installers/install_starship.sh index da2d144..29553dc 100644 --- a/installers/install_starship.sh +++ b/installers/install_starship.sh @@ -45,21 +45,15 @@ install_starship() { log_info "Fetching latest Starship version from GitHub..." local latest_tag="" - latest_tag=$(curl -sL https://api.github.com/repos/starship/starship/releases/latest | grep '"tag_name":' | head -n1 | sed -E 's/.*"tag_name": "([^"]+)".*/\1/' || true) - - local download_url - if [ -n "$latest_tag" ]; then - log_info "Latest Starship version found: $latest_tag" - download_url="https://github.com/starship/starship/releases/download/${latest_tag}/starship-${target}.tar.gz" - else + latest_tag=$(github_get_latest_release "starship/starship") + + if [ -z "$latest_tag" ]; then latest_tag="latest" - log_warn "Failed to fetch latest version from GitHub. Falling back to downloading latest release directly." - download_url="https://github.com/starship/starship/releases/latest/download/starship-${target}.tar.gz" fi - log_info "Downloading Starship from ${download_url}..." + log_info "Downloading Starship ${latest_tag}..." local archive="$TMP_DIR/starship.tar.gz" - download_file "$download_url" "$archive" + github_download_asset "starship/starship" "$latest_tag" "starship-${target}\.tar\.gz" "$archive" # Extract the binary log_info "Extracting Starship binary..." diff --git a/installers/install_uv.sh b/installers/install_uv.sh index 64ca56a..f538a09 100644 --- a/installers/install_uv.sh +++ b/installers/install_uv.sh @@ -54,21 +54,15 @@ install_uv() { log_info "Fetching latest uv version from GitHub..." local latest_tag="" - latest_tag=$(curl -sL https://api.github.com/repos/astral-sh/uv/releases/latest | grep '"tag_name":' | head -n1 | sed -E 's/.*"tag_name": "([^"]+)".*/\1/' || true) + latest_tag=$(github_get_latest_release "astral-sh/uv") - local download_url - if [ -n "$latest_tag" ]; then - log_info "Latest uv version found: $latest_tag" - download_url="https://github.com/astral-sh/uv/releases/download/${latest_tag}/uv-${target}.tar.gz" - else + if [ -z "$latest_tag" ]; then latest_tag="latest" - log_warn "Failed to fetch latest version from GitHub. Falling back to downloading latest release directly." - download_url="https://github.com/astral-sh/uv/releases/latest/download/uv-${target}.tar.gz" fi - log_info "Downloading uv from ${download_url}..." + log_info "Downloading uv ${latest_tag}..." local archive="$TMP_DIR/uv.tar.gz" - download_file "$download_url" "$archive" + github_download_asset "astral-sh/uv" "$latest_tag" "uv-${target}\.tar\.gz" "$archive" # Extract the binaries log_info "Extracting uv binaries..." diff --git a/lib/github.sh b/lib/github.sh index c171669..5f7d9e4 100644 --- a/lib/github.sh +++ b/lib/github.sh @@ -3,6 +3,11 @@ # Usage: github_get_latest_release # Prints the tag_name of the latest release. + +# Installers still use this function instead of just directly invoking download_asset function: +# - Asset names often contain the version +# - Installers may compare the latest tag from github against the locally installed version before doing any work. +# - We need concrete version string so we can pass it to the reigster_tool function. github_get_latest_release() { local repo="$1" local tag