From 263d2e6f30c78ae1a4863b31b9bd22d7eac83296 Mon Sep 17 00:00:00 2001 From: Wyatt Gill Date: Fri, 7 Jun 2024 16:27:13 -0500 Subject: [PATCH] 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. --- internal/feed/github.go | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/internal/feed/github.go b/internal/feed/github.go index 43a2459..4d7dc73 100644 --- a/internal/feed/github.go +++ b/internal/feed/github.go @@ -8,12 +8,10 @@ import ( "time" ) -type githubReleaseResponseJson struct { +type githubReleaseLatestResponseJson struct { TagName string `json:"tag_name"` PublishedAt string `json:"published_at"` HtmlUrl string `json:"html_url"` - Draft bool `json:"draft"` - PreRelease bool `json:"prerelease"` Reactions struct { Downvotes int `json:"-1"` } `json:"reactions"` @@ -39,7 +37,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele requests := make([]*http.Request, len(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 != "" { request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) @@ -48,7 +46,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele requests[i] = request } - task := decodeJsonFromRequestTask[[]githubReleaseResponseJson](defaultClient) + task := decodeJsonFromRequestTask[githubReleaseLatestResponseJson](defaultClient) job := newJob(task, requests).withWorkers(15) responses, errs, err := workerPoolDo(job) @@ -65,24 +63,7 @@ func FetchLatestReleasesFromGithub(repositories []string, token string) (AppRele continue } - releases := 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 - } - } + liveRelease := &responses[i] if liveRelease == nil { slog.Error("No live release found", "repository", repositories[i], "url", requests[i].URL)