CheckForUpdate checks if a newer version is available.
(currentVersion string, opts Options)
| 56 | |
| 57 | // CheckForUpdate checks if a newer version is available. |
| 58 | func CheckForUpdate(currentVersion string, opts Options) (*CheckResult, error) { |
| 59 | current := normalizeVersion(currentVersion) |
| 60 | |
| 61 | client := &http.Client{Timeout: checkTimeout} |
| 62 | resp, err := client.Get(opts.releasesURL()) |
| 63 | if err != nil { |
| 64 | return nil, fmt.Errorf("fetching latest release: %w", err) |
| 65 | } |
| 66 | defer resp.Body.Close() |
| 67 | |
| 68 | // Rate limited — silently assume current version is up to date |
| 69 | if resp.StatusCode == http.StatusForbidden { |
| 70 | return &CheckResult{ |
| 71 | CurrentVersion: current, |
| 72 | LatestVersion: current, |
| 73 | UpdateAvailable: false, |
| 74 | }, nil |
| 75 | } |
| 76 | if resp.StatusCode != http.StatusOK { |
| 77 | return nil, fmt.Errorf("GitHub API returned status %d", resp.StatusCode) |
| 78 | } |
| 79 | |
| 80 | var release Release |
| 81 | if err := json.NewDecoder(resp.Body).Decode(&release); err != nil { |
| 82 | return nil, fmt.Errorf("parsing release response: %w", err) |
| 83 | } |
| 84 | |
| 85 | latest := normalizeVersion(release.TagName) |
| 86 | |
| 87 | return &CheckResult{ |
| 88 | CurrentVersion: current, |
| 89 | LatestVersion: latest, |
| 90 | UpdateAvailable: baseVersion(current) != latest && current != "dev", |
| 91 | }, nil |
| 92 | } |
| 93 | |
| 94 | // PerformUpdate downloads and installs the latest version. |
| 95 | func PerformUpdate(currentVersion string, opts Options) (*CheckResult, error) { |