latest returns the latest version listed in url, according to semver, expecting an array of release. latest skips version strings that cannot be parsed. latest returns an error when there are no correct versions.
(ctx context.Context, client *http.Client, url string)
| 66 | // latest skips version strings that cannot be parsed. |
| 67 | // latest returns an error when there are no correct versions. |
| 68 | func latest(ctx context.Context, client *http.Client, url string) (semver.Version, error) { |
| 69 | req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) |
| 70 | if err != nil { |
| 71 | return semver.Version{}, err |
| 72 | } |
| 73 | resp, err := client.Do(req) |
| 74 | if err != nil { |
| 75 | return semver.Version{}, err |
| 76 | } |
| 77 | defer resp.Body.Close() |
| 78 | body, err := io.ReadAll(resp.Body) |
| 79 | if err != nil { |
| 80 | return semver.Version{}, err |
| 81 | } |
| 82 | var releases []release |
| 83 | err = json.Unmarshal(body, &releases) |
| 84 | if err != nil { |
| 85 | return semver.Version{}, err |
| 86 | } |
| 87 | var maxVersion *semver.Version |
| 88 | for _, r := range releases { |
| 89 | versionString := strings.TrimPrefix(r.TagName, "v") |
| 90 | rv, err := semver.Parse(versionString) |
| 91 | if err != nil { |
| 92 | continue |
| 93 | } |
| 94 | if maxVersion == nil || rv.GT(*maxVersion) { |
| 95 | maxVersion = &rv |
| 96 | } |
| 97 | } |
| 98 | if maxVersion == nil { |
| 99 | return semver.Version{}, errNoRemote.WithAttributes("url", url) |
| 100 | } |
| 101 | return *maxVersion, nil |
| 102 | } |
| 103 | |
| 104 | // Update is the latest version. |
| 105 | type Update struct { |
no test coverage detected