Skip to content

Commit

Permalink
Replace version comparison package
Browse files Browse the repository at this point in the history
  • Loading branch information
pjcdawkins committed Jan 2, 2025
1 parent f67c3f7 commit c21e065
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 16 deletions.
3 changes: 1 addition & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ go 1.22
toolchain go1.22.4

require (
github.com/Masterminds/semver/v3 v3.3.1
github.com/fatih/color v1.17.0
github.com/go-chi/chi/v5 v5.1.0
github.com/go-playground/validator/v10 v10.20.0
Expand All @@ -18,14 +19,12 @@ require (
github.com/stretchr/testify v1.9.0
github.com/wk8/go-ordered-map/v2 v2.1.8
golang.org/x/crypto v0.31.0
golang.org/x/mod v0.18.0
gopkg.in/yaml.v3 v3.0.1
)

require (
github.com/AlecAivazis/survey/v2 v2.3.7 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/Masterminds/sprig/v3 v3.2.3 // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
Expand Down
6 changes: 2 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1r
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=
Expand Down Expand Up @@ -160,8 +160,6 @@ golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ss
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY=
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
Expand Down
32 changes: 25 additions & 7 deletions internal/config/alt/auto_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"os"
"time"

"golang.org/x/mod/semver"
"github.com/Masterminds/semver/v3"
"gopkg.in/yaml.v3"

"github.com/platformsh/cli/internal/config"
Expand Down Expand Up @@ -72,12 +72,15 @@ func AutoUpdate(ctx context.Context, cnf *config.Config, debugLog func(fmt strin
debugLog("Config is already up to date (updated at %v)", cnf.Metadata.UpdatedAt)
return nil
}
if newCnfStruct.Metadata.Version != "" &&
(cnf.Metadata.Version == newCnfStruct.Metadata.Version ||
// TODO find a version comparison tool that does not require a "v" prefix
semver.Compare(cnf.Metadata.Version, newCnfStruct.Metadata.Version) > 0) {
debugLog("Config is already up to date (version %s)", cnf.Metadata.Version)
return nil
if newCnfStruct.Metadata.Version != "" {
cmp, err := versionCompare(cnf.Metadata.Version, newCnfStruct.Metadata.Version)
if err != nil {
return fmt.Errorf("could not compare config versions: %w", err)
}
if cmp >= 0 {
debugLog("Config is already up to date (version %s)", cnf.Metadata.Version)
return nil
}
}
b, err := yaml.Marshal(newCnfNode)
if err != nil {
Expand All @@ -97,3 +100,18 @@ func AutoUpdate(ctx context.Context, cnf *config.Config, debugLog func(fmt strin

return nil
}

func versionCompare(v1, v2 string) (int, error) {
if v1 == v2 {
return 0, nil
}
v1V, err := semver.NewVersion(v1)
if err != nil {
return 0, err
}
v2V, err := semver.NewVersion(v2)
if err != nil {
return 0, err
}
return v1V.Compare(v2V), nil
}
10 changes: 7 additions & 3 deletions internal/config/alt/auto_update_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,15 @@ func TestAutoUpdate(t *testing.T) {
}
resetTimes()

cnf.Metadata.Version = "v1.0.1"
remoteConfig = append(remoteConfig, []byte("\nmetadata: {version: v1.0.1}")...)
remoteConfig = append(remoteConfig, []byte("\nmetadata: {version: 1.0.1}")...)
cnf.Metadata.Version = "invalid"
err = alt.AutoUpdate(ctx, cnf, logger)
assert.ErrorContains(t, err, "could not compare config versions")
resetTimes()
cnf.Metadata.Version = "1.0.1"
err = alt.AutoUpdate(ctx, cnf, logger)
assert.NoError(t, err)
assert.Contains(t, lastLogged, "Config is already up to date (version v1.0.1)")
assert.Contains(t, lastLogged, "Config is already up to date (version 1.0.1)")

resetTimes()

Expand Down
35 changes: 35 additions & 0 deletions internal/config/alt/version_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package alt

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestVersionCompare(t *testing.T) {
cases := []struct {
v1 string
v2 string
expected int
shouldError bool
}{
{v1: "1.0", v2: "1.0"},
{v1: "1.0", v2: "2.0", expected: -1},
{v1: "1.0.0", v2: "1.0.0"},
{v1: "1.0.1", v2: "1.0.0", expected: 1},
{v1: "1.0.1", v2: "2", expected: -1},
{v1: "1.0.1-dev", v2: "1.0.1", expected: -1},
{v1: "1.0.1+context", v2: "1.0.1"},
{v1: "1.0.1_invalid", v2: "1.0.1", shouldError: true},
{v1: "1.0.1", v2: "2.0.0_invalid", shouldError: true},
}
for _, c := range cases {
comment := c.v1 + " <=> " + c.v2
result, err := versionCompare(c.v1, c.v2)
if c.shouldError {
assert.Error(t, err, comment)
} else {
assert.Equal(t, c.expected, result, comment)
}
}
}

0 comments on commit c21e065

Please sign in to comment.