From e748c461bd0e66f82e7cde58bdcdfbd09ff59d9b Mon Sep 17 00:00:00 2001 From: Sune Keller Date: Wed, 24 Mar 2021 23:38:12 +0100 Subject: [PATCH 1/2] Fix bin update on prerelease-only github repos Signed-off-by: Sune Keller --- cmd/update.go | 3 +++ pkg/providers/github.go | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/cmd/update.go b/cmd/update.go index c233041..c746609 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -164,6 +164,9 @@ func getLatestVersion(b *config.Binary, p providers.Provider) (*updateInfo, erro if err != nil { return nil, fmt.Errorf("Error checking updates for %s, %w", b.Path, err) } + if v == "" && u == "" { + return nil, nil + } if b.Version == v { return nil, nil diff --git a/pkg/providers/github.go b/pkg/providers/github.go index ee80adb..aaddd34 100644 --- a/pkg/providers/github.go +++ b/pkg/providers/github.go @@ -82,6 +82,20 @@ func (g *gitHub) GetLatestVersion() (string, string, error) { log.Debugf("Getting latest release for %s/%s", g.owner, g.repo) release, _, err := g.client.Repositories.GetLatestRelease(context.TODO(), g.owner, g.repo) if err != nil { + // If the error is that no latest release was found, it could be that there are only pre-releases + if ghErrResp, ok := err.(*github.ErrorResponse); ok && ghErrResp.Response.StatusCode == http.StatusNotFound { + // Get the first release returned by ListReleases + releases, _, listErr := g.client.Repositories.ListReleases(context.TODO(), g.owner, g.repo, &github.ListOptions{PerPage: 1}) + if listErr != nil { + return "", "", listErr + } + if len(releases) > 0 { + return releases[0].GetTagName(), releases[0].GetHTMLURL(), nil + } + // Return original 404/StatusNotFound error from GetLatestRelease + return "", "", err + } + return "", "", err } From e4042ee5a907627932115010fe29a03af6ff9abc Mon Sep 17 00:00:00 2001 From: Sune Keller Date: Wed, 24 Mar 2021 23:58:02 +0100 Subject: [PATCH 2/2] Use same method for Fetch and GetLatestVersion Signed-off-by: Sune Keller --- pkg/providers/github.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/pkg/providers/github.go b/pkg/providers/github.go index aaddd34..e80ae30 100644 --- a/pkg/providers/github.go +++ b/pkg/providers/github.go @@ -29,16 +29,12 @@ func (g *gitHub) Fetch(opts *FetchOpts) (*File, error) { // If we have a tag, let's fetch from there var err error - var resp *github.Response if len(g.tag) > 0 { log.Infof("Getting %s release for %s/%s", g.tag, g.owner, g.repo) release, _, err = g.client.Repositories.GetReleaseByTag(context.TODO(), g.owner, g.repo, g.tag) } else { log.Infof("Getting latest release for %s/%s", g.owner, g.repo) - release, resp, err = g.client.Repositories.GetLatestRelease(context.TODO(), g.owner, g.repo) - if resp.StatusCode == http.StatusNotFound { - err = fmt.Errorf("repository %s/%s does not have releases", g.owner, g.repo) - } + release, err = g.getAnyLatestRelease(context.TODO()) } if err != nil { @@ -80,26 +76,33 @@ func (g *gitHub) Fetch(opts *FetchOpts) (*File, error) { // returns the corresponding name and url to fetch the version func (g *gitHub) GetLatestVersion() (string, string, error) { log.Debugf("Getting latest release for %s/%s", g.owner, g.repo) - release, _, err := g.client.Repositories.GetLatestRelease(context.TODO(), g.owner, g.repo) + release, err := g.getAnyLatestRelease(context.TODO()) + if err != nil { + return "", "", err + } + + return release.GetTagName(), release.GetHTMLURL(), nil +} + +func (g *gitHub) getAnyLatestRelease(ctx context.Context) (*github.RepositoryRelease, error) { + release, _, err := g.client.Repositories.GetLatestRelease(ctx, g.owner, g.repo) if err != nil { // If the error is that no latest release was found, it could be that there are only pre-releases if ghErrResp, ok := err.(*github.ErrorResponse); ok && ghErrResp.Response.StatusCode == http.StatusNotFound { // Get the first release returned by ListReleases - releases, _, listErr := g.client.Repositories.ListReleases(context.TODO(), g.owner, g.repo, &github.ListOptions{PerPage: 1}) + releases, _, listErr := g.client.Repositories.ListReleases(ctx, g.owner, g.repo, &github.ListOptions{PerPage: 1}) if listErr != nil { - return "", "", listErr + return nil, listErr } if len(releases) > 0 { - return releases[0].GetTagName(), releases[0].GetHTMLURL(), nil + return releases[0], nil } - // Return original 404/StatusNotFound error from GetLatestRelease - return "", "", err } - return "", "", err + // Return original 404/StatusNotFound error from GetLatestRelease + return nil, err } - - return release.GetTagName(), release.GetHTMLURL(), nil + return release, err } func (g *gitHub) GetID() string {