Use GitHub's latest release API endpoint

The current releases widget uses the releases endpoint to pull the 10
most recent releases and filter them to find the latest release. This
causes a problem when a repository's latest release is outside of the 10
most recent (e.g. 10 prereleases):

ERROR No live release found repository=cross-seed/cross-seed url="https://api.github.com/repos/cross-seed/cross-seed/releases?per_page=10"

This is no longer a problem when using the latest release endpoint which
grabs the latest release, ignoring draft releases and prereleases.
This commit is contained in:
Wyatt Gill 2024-06-07 16:27:13 -05:00
parent 757f68c872
commit 263d2e6f30

View File

@ -8,12 +8,10 @@ import (
"time" "time"
) )
type githubReleaseResponseJson struct { type githubReleaseLatestResponseJson struct {
TagName string `json:"tag_name"` TagName string `json:"tag_name"`
PublishedAt string `json:"published_at"` PublishedAt string `json:"published_at"`
HtmlUrl string `json:"html_url"` HtmlUrl string `json:"html_url"`
Draft bool `json:"draft"`
PreRelease bool `json:"prerelease"`
Reactions struct { Reactions struct {
Downvotes int `json:"-1"` Downvotes int `json:"-1"`
} `json:"reactions"` } `json:"reactions"`
@ -39,7 +37,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele
requests := make([]*http.Request, len(repositories)) requests := make([]*http.Request, len(repositories))
for i, repository := range repositories { for i, repository := range repositories {
request, _ := http.NewRequest("GET", fmt.Sprintf("https://api.github.com/repos/%s/releases?per_page=10", repository), nil) request, _ := http.NewRequest("GET", fmt.Sprintf("https://api.github.com/repos/%s/releases/latest", repository), nil)
if token != "" { if token != "" {
request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
@ -48,7 +46,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele
requests[i] = request requests[i] = request
} }
task := decodeJsonFromRequestTask[[]githubReleaseResponseJson](defaultClient) task := decodeJsonFromRequestTask[githubReleaseLatestResponseJson](defaultClient)
job := newJob(task, requests).withWorkers(15) job := newJob(task, requests).withWorkers(15)
responses, errs, err := workerPoolDo(job) responses, errs, err := workerPoolDo(job)
@ -65,24 +63,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele
continue continue
} }
releases := responses[i] liveRelease := &responses[i]
if len(releases) < 1 {
failed++
slog.Error("No releases found", "repository", repositories[i], "url", requests[i].URL)
continue
}
var liveRelease *githubReleaseResponseJson
for i := range releases {
release := &releases[i]
if !release.Draft && !release.PreRelease {
liveRelease = release
break
}
}
if liveRelease == nil { if liveRelease == nil {
slog.Error("No live release found", "repository", repositories[i], "url", requests[i].URL) slog.Error("No live release found", "repository", repositories[i], "url", requests[i].URL)