feat(cli): adjust release line constraint and output order of upgrade path command (#1561)

* fix(cli): consider alpha & beta as release version on main line

* fix(cli): dont allow upgrade commands with incompatible base & cli release line

* feat(cli): support order sort option for upgrade path command
This commit is contained in:
dkeven 2025-07-18 00:36:57 +08:00 committed by GitHub
parent a71b536a80
commit 9d097f77b1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 21 additions and 3 deletions

View file

@ -12,6 +12,7 @@ import (
"github.com/spf13/cobra"
"log"
"os"
"slices"
)
type UpgradeOsOptions struct {
@ -43,6 +44,7 @@ func NewCmdUpgradeOs() *cobra.Command {
func NewCmdGetUpgradePath() *cobra.Command {
var baseVersionStr string
var latestFirst bool
cmd := &cobra.Command{
Use: "path",
Short: "Get the upgrade path (required intermediate versions) from base version to the latest upgradable version (as known to this release of olares-cli)",
@ -65,6 +67,11 @@ func NewCmdGetUpgradePath() *cobra.Command {
fmt.Println(err)
os.Exit(1)
}
if latestFirst {
slices.Reverse(path)
}
encoder := json.NewEncoder(cmd.OutOrStdout())
encoder.SetIndent("", " ")
return encoder.Encode(path)
@ -72,6 +79,7 @@ func NewCmdGetUpgradePath() *cobra.Command {
}
cmd.Flags().StringVarP(&baseVersionStr, "base-version", "b", baseVersionStr, "base version to be upgraded, defaults to the current Olares version if inside Olares cluster")
cmd.Flags().BoolVar(&latestFirst, "latest-first", true, "sort versions to put recent ones in the front")
return cmd
}

View file

@ -22,9 +22,15 @@ var (
func getReleaseLineOfVersion(v *semver.Version) releaseLine {
preRelease := v.Prerelease()
if preRelease == "" || strings.HasPrefix(preRelease, "rc") {
mainLinePrereleasePrefixes := []string{"alpha", "beta", "rc"}
if preRelease == "" {
return mainLine
}
for _, prefix := range mainLinePrereleasePrefixes {
if strings.HasPrefix(preRelease, prefix) {
return mainLine
}
}
return dailyLine
}
@ -32,11 +38,16 @@ func check(base *semver.Version, target *semver.Version) error {
if base == nil {
return fmt.Errorf("base version is nil")
}
baseReleaseLine := getReleaseLineOfVersion(base)
cliVersion, err := utils.ParseOlaresVersionString(version.VERSION)
if err != nil {
return fmt.Errorf("invalid olares-cli version :\"%s\"", version.VERSION)
}
cliReleaseLine := getReleaseLineOfVersion(cliVersion)
if baseReleaseLine != cliReleaseLine {
return fmt.Errorf("incompatible base release line: %s and olares-cli release line: %s", baseReleaseLine, cliReleaseLine)
}
if target != nil {
if !target.GreaterThan(base) {
@ -44,11 +55,10 @@ func check(base *semver.Version, target *semver.Version) error {
}
targetReleaseLine := getReleaseLineOfVersion(target)
baseReleaseLine := getReleaseLineOfVersion(base)
if targetReleaseLine != baseReleaseLine {
return fmt.Errorf("unable to upgrade to %s on %s release line from %s on %s release line", target, targetReleaseLine, base, baseReleaseLine)
}
switch baseReleaseLine {
switch targetReleaseLine {
case mainLine:
if !sameMajorLevelVersion(base, target) {
return fmt.Errorf("upgrade on %s rlease line can only be performed across same major level version", baseReleaseLine)