diff --git a/misc/tools.func b/misc/tools.func index 37bb99998..4ad43d7bc 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -783,16 +783,25 @@ github_api_call() { for attempt in $(seq 1 $max_retries); do local http_code - http_code=$(curl -fsSL -w "%{http_code}" -o "$output_file" \ + http_code=$(curl -sSL -w "%{http_code}" -o "$output_file" \ -H "Accept: application/vnd.github+json" \ -H "X-GitHub-Api-Version: 2022-11-28" \ "${header_args[@]}" \ - "$url" 2>/dev/null || echo "000") + "$url" 2>/dev/null) || true case "$http_code" in 200) return 0 ;; + 401) + msg_error "GitHub API authentication failed (HTTP 401)." + if [[ -n "${GITHUB_TOKEN:-}" ]]; then + msg_error "Your GITHUB_TOKEN appears to be invalid or expired." + else + msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\"" + fi + return 1 + ;; 403) # Rate limit - check if we can retry if [[ $attempt -lt $max_retries ]]; then @@ -801,11 +810,22 @@ github_api_call() { retry_delay=$((retry_delay * 2)) continue fi - msg_error "GitHub API rate limit exceeded. Set GITHUB_TOKEN to increase limits." + msg_error "GitHub API rate limit exceeded (HTTP 403)." + msg_error "To increase the limit, export a GitHub token before running the script:" + msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\"" return 1 ;; 404) - msg_error "GitHub API endpoint not found: $url" + msg_error "GitHub repository or release not found (HTTP 404): $url" + return 1 + ;; + 000 | "") + if [[ $attempt -lt $max_retries ]]; then + sleep "$retry_delay" + continue + fi + msg_error "GitHub API connection failed (no response)." + msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit" return 1 ;; *) @@ -813,7 +833,7 @@ github_api_call() { sleep "$retry_delay" continue fi - msg_error "GitHub API call failed with HTTP $http_code" + msg_error "GitHub API call failed (HTTP $http_code)." return 1 ;; esac @@ -833,14 +853,18 @@ codeberg_api_call() { for attempt in $(seq 1 $max_retries); do local http_code - http_code=$(curl -fsSL -w "%{http_code}" -o "$output_file" \ + http_code=$(curl -sSL -w "%{http_code}" -o "$output_file" \ -H "Accept: application/json" \ - "$url" 2>/dev/null || echo "000") + "$url" 2>/dev/null) || true case "$http_code" in 200) return 0 ;; + 401) + msg_error "Codeberg API authentication failed (HTTP 401)." + return 1 + ;; 403) # Rate limit - retry if [[ $attempt -lt $max_retries ]]; then @@ -849,11 +873,20 @@ codeberg_api_call() { retry_delay=$((retry_delay * 2)) continue fi - msg_error "Codeberg API rate limit exceeded." + msg_error "Codeberg API rate limit exceeded (HTTP 403)." return 1 ;; 404) - msg_error "Codeberg API endpoint not found: $url" + msg_error "Codeberg repository or release not found (HTTP 404): $url" + return 1 + ;; + 000 | "") + if [[ $attempt -lt $max_retries ]]; then + sleep "$retry_delay" + continue + fi + msg_error "Codeberg API connection failed (no response)." + msg_error "Check your network/DNS: curl -sSL https://codeberg.org" return 1 ;; *) @@ -861,7 +894,7 @@ codeberg_api_call() { sleep "$retry_delay" continue fi - msg_error "Codeberg API call failed with HTTP $http_code" + msg_error "Codeberg API call failed (HTTP $http_code)." return 1 ;; esac @@ -1441,7 +1474,7 @@ get_latest_github_release() { if ! github_api_call "https://api.github.com/repos/${repo}/releases/latest" "$temp_file"; then rm -f "$temp_file" - return 1 + return 0 fi local version @@ -1449,7 +1482,8 @@ get_latest_github_release() { rm -f "$temp_file" if [[ -z "$version" ]]; then - return 1 + msg_error "Could not determine latest version for ${repo}" + return 0 fi echo "$version" @@ -1466,7 +1500,7 @@ get_latest_codeberg_release() { # Codeberg API: get all releases and pick the first non-draft/non-prerelease if ! codeberg_api_call "https://codeberg.org/api/v1/repos/${repo}/releases" "$temp_file"; then rm -f "$temp_file" - return 1 + return 0 fi local version @@ -1480,7 +1514,8 @@ get_latest_codeberg_release() { rm -f "$temp_file" if [[ -z "$version" ]]; then - return 1 + msg_error "Could not determine latest version for ${repo}" + return 0 fi echo "$version" @@ -1567,13 +1602,34 @@ get_latest_gh_tag() { "${header_args[@]}" \ "https://api.github.com/repos/${repo}/tags?per_page=100" 2>/dev/null) || true + if [[ "$http_code" == "401" ]]; then + msg_error "GitHub API authentication failed (HTTP 401)." + if [[ -n "${GITHUB_TOKEN:-}" ]]; then + msg_error "Your GITHUB_TOKEN appears to be invalid or expired." + else + msg_error "The repository may require authentication. Try: export GITHUB_TOKEN=\"ghp_your_token\"" + fi + rm -f /tmp/gh_tags.json + return 1 + fi + if [[ "$http_code" == "403" ]]; then - msg_warn "GitHub API rate limit exceeded while fetching tags for ${repo}" + msg_error "GitHub API rate limit exceeded (HTTP 403)." + msg_error "To increase the limit, export a GitHub token before running the script:" + msg_error " export GITHUB_TOKEN=\"ghp_your_token_here\"" + rm -f /tmp/gh_tags.json + return 1 + fi + + if [[ "$http_code" == "000" || -z "$http_code" ]]; then + msg_error "GitHub API connection failed (no response)." + msg_error "Check your network/DNS: curl -sSL https://api.github.com/rate_limit" rm -f /tmp/gh_tags.json return 1 fi if [[ "$http_code" != "200" ]] || [[ ! -s /tmp/gh_tags.json ]]; then + msg_error "Unable to fetch tags for ${repo} (HTTP ${http_code})" rm -f /tmp/gh_tags.json return 1 fi @@ -1659,6 +1715,15 @@ check_for_gh_release() { if [[ "$http_code" == "200" ]] && [[ -s /tmp/gh_check.json ]]; then releases_json="[$(