Skip to content
Merged
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
11 changes: 11 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,17 @@
"args": [
"status"
]
},
{
"name": "version",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}/cmd/rhoas",
"env": {},
"args": [
"version"
]
}
]
}
2 changes: 1 addition & 1 deletion cmd/rhoas/pkged.go

Large diffs are not rendered by default.

51 changes: 31 additions & 20 deletions internal/build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package build

import (
"context"
"regexp"
"runtime/debug"

"github.com/google/go-github/github"
"github.com/redhat-developer/app-services-cli/internal/localizer"
"github.com/redhat-developer/app-services-cli/pkg/color"
"github.com/redhat-developer/app-services-cli/pkg/logging"
)
Expand Down Expand Up @@ -54,47 +54,58 @@ func init() {
// the version currently being used. If so, it logs this information
// to the console.
func CheckForUpdate(ctx context.Context, logger logging.Logger) {
latest, err := getLatestVersion(ctx)
releases, err := getReleases(ctx)
if err != nil {
logger.Debug("Could not check latest version:", err)
return
}

latestVersion := latest.TagName
var latestRelease *github.RepositoryRelease
releaseTagIndexMap := map[string]int{}
for i, release := range releases {
// assign the latest non-pre release as the latest public release
if latestRelease == nil && !release.GetPrerelease() {
latestRelease = release
}

// create an tag:index map of the releases
// the first index (0) is the latest release
releaseTagIndexMap[release.GetTagName()] = i
if release.GetTagName() == Version {
break
}
}

// if the user is using a dev or pre-release version, do not check for if an update is available
if isDevBuild() || isPreRelease(Version) {
currentVersionIndex, ok := releaseTagIndexMap[Version]
if !ok {
// the currently used version does not exist as a public release
// assume it to be an unpublished or dev release
return
}

if latestVersion != &Version {
latestVersionIndex := releaseTagIndexMap[latestRelease.GetTagName()]

// if the index of the current version is greater than the latest release
// this means it is older, and therefore, an update is available.
if currentVersionIndex > latestVersionIndex {
logger.Info()
logger.Info(color.Info("A new version of rhoas is available:"), color.CodeSnippet(*latestVersion))
logger.Info(color.Info(latest.GetHTMLURL()))
logger.Info(color.Info(localizer.MustLocalizeFromID("common.log.info.updateAvailable")), color.CodeSnippet(latestRelease.GetTagName()))
logger.Info(color.Info(latestRelease.GetHTMLURL()))
logger.Info()
}
}

// Get the latest version of the CLI
func getLatestVersion(ctx context.Context) (*github.RepositoryRelease, error) {
func getReleases(ctx context.Context) ([]*github.RepositoryRelease, error) {
client := github.NewClient(nil)

latest, _, err := client.Repositories.GetLatestRelease(ctx, RepositoryOwner, RepositoryName)
releases, _, err := client.Repositories.ListReleases(ctx, RepositoryOwner, RepositoryName, nil)
if err != nil {
return nil, err
}

return latest, nil
return releases, nil
}

// isDevBuild returns true if the current build is "dev" (dev build)
func isDevBuild() bool {
return Version == "dev"
}

// check if the tag is a pre-release tag
// true it if contains anything other than MAJOR.MINOR.PATCH
func isPreRelease(tag string) bool {
match, _ := regexp.MatchString("^[0-9]+\\.[0-9]+\\.[0-9]+$", tag)
return !match
}
5 changes: 4 additions & 1 deletion locales/common/active.en.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ one = 'could not cast "{{.Value}}" to {{.Type}}'
one = 'Could not save refreshed tokens to config:'

[common.error.unsupportedOperatingSystem]
one = 'unsupported operating system "{{.OS}}"'
one = 'unsupported operating system "{{.OS}}"'

[common.log.info.updateAvailable]
one = 'A new version of rhoas is available:'