Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions internal/updates/updates.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,21 @@ func install(artifactArch, downloadURL, installLocation string, timeout int) err
return nil
}

// isStableRelease returns true if the release is a full semver release (not a
// draft, not marked as pre-release, and has no pre-release component in its tag).
func isStableRelease(release *github.RepositoryRelease) bool {
if release.GetDraft() || release.GetPrerelease() {
return false
}

v, err := version.NewVersion(release.GetTagName())
if err != nil {
return false
}

return v.Prerelease() == ""
}

func getLatestRelease(ctx context.Context, artifactArch string, timeout time.Duration) (*github.RepositoryRelease, *github.ReleaseAsset, error) {
client := github.NewClient(&http.Client{
Timeout: timeout,
Expand Down Expand Up @@ -328,6 +343,10 @@ func getLatestRelease(ctx context.Context, artifactArch string, timeout time.Dur
}

for _, release := range releases {
if !isStableRelease(release) {
continue
}

for _, asset := range release.Assets {
if strings.Contains(strings.ToLower(asset.GetName()), strings.ToLower(artifactArch)) {
_ = releaseCache.Store(&ReleaseCache{
Expand Down
91 changes: 91 additions & 0 deletions internal/updates/updates_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package updates

import (
"testing"

"github.com/google/go-github/v63/github"
"github.com/stretchr/testify/assert"
)

func TestIsStableRelease(t *testing.T) {
t.Parallel()

tests := []struct {
name string
release *github.RepositoryRelease
wantStable bool
}{
{
name: "stable release",
release: &github.RepositoryRelease{
TagName: github.String("v1.2.3"),
Draft: github.Bool(false),
Prerelease: github.Bool(false),
},
wantStable: true,
},
{
name: "pre-release tag with dash suffix",
release: &github.RepositoryRelease{
TagName: github.String("v1.2.3-pre.0"),
Draft: github.Bool(false),
Prerelease: github.Bool(false),
},
wantStable: false,
},
{
name: "pre-release tag with alpha suffix",
release: &github.RepositoryRelease{
TagName: github.String("v1.2.3-alpha.1"),
Draft: github.Bool(false),
Prerelease: github.Bool(false),
},
wantStable: false,
},
{
name: "pre-release tag with rc suffix",
release: &github.RepositoryRelease{
TagName: github.String("v2.0.0-rc.1"),
Draft: github.Bool(false),
Prerelease: github.Bool(false),
},
wantStable: false,
},
{
name: "github marked as pre-release",
release: &github.RepositoryRelease{
TagName: github.String("v1.2.3"),
Draft: github.Bool(false),
Prerelease: github.Bool(true),
},
wantStable: false,
},
{
name: "draft release",
release: &github.RepositoryRelease{
TagName: github.String("v1.2.3"),
Draft: github.Bool(true),
Prerelease: github.Bool(false),
},
wantStable: false,
},
{
name: "invalid tag",
release: &github.RepositoryRelease{
TagName: github.String("not-a-version"),
Draft: github.Bool(false),
Prerelease: github.Bool(false),
},
wantStable: false,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()

got := isStableRelease(tt.release)
assert.Equal(t, tt.wantStable, got)
})
}
}
Loading