Skip to content

Commit 806aa51

Browse files
authored
fix: replace hashicorp/go-version with golang.org/x/mod/semver (#532)
* fix: replace hashicorp/go-version with golang.org/x/mod/semver The hashicorp/go-version package uses an MPL-2.0 license that triggers Snyk license policy violations. Replace it with golang.org/x/mod/semver (BSD-3-Clause) which is already a direct dependency. * fix: include invalid value in semver error messages
1 parent 96ea244 commit 806aa51

3 files changed

Lines changed: 34 additions & 20 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ require (
1111
github.com/cli/safeexec v1.0.1
1212
github.com/google/uuid v1.6.0
1313
github.com/gorilla/websocket v1.5.3
14-
github.com/hashicorp/go-version v1.9.0
1514
github.com/joho/godotenv v1.5.1
1615
github.com/kyokomi/emoji/v2 v2.2.13
1716
github.com/logrusorgru/aurora/v4 v4.0.0
@@ -303,6 +302,7 @@ require (
303302
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
304303
github.com/hashicorp/go-multierror v1.1.1 // indirect
305304
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
305+
github.com/hashicorp/go-version v1.9.0 // indirect
306306
github.com/hashicorp/golang-lru v1.0.2 // indirect
307307
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
308308
github.com/hexops/gotextdiff v1.0.3 // indirect

internal/update/semver.go

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,44 @@
1515
package update
1616

1717
import (
18-
"github.com/hashicorp/go-version"
18+
"golang.org/x/mod/semver"
19+
1920
"github.com/slackapi/slack-cli/internal/slackerror"
2021
)
2122

2223
// SemVerGreaterThan returns true if release is greater than current
2324
func SemVerGreaterThan(release string, current string) (bool, error) {
24-
releaseVersion, err := version.NewVersion(release)
25-
if err != nil {
26-
return false, slackerror.New(slackerror.ErrInvalidSemVer).WithRootCause(err)
25+
r := ensureVPrefix(release)
26+
c := ensureVPrefix(current)
27+
if !semver.IsValid(r) {
28+
return false, slackerror.New(slackerror.ErrInvalidSemVer).
29+
WithMessage("Value %s is not a semantic version", release)
2730
}
28-
currentVersion, err := version.NewVersion(current)
29-
if err != nil {
30-
return false, slackerror.New(slackerror.ErrInvalidSemVer).WithRootCause(err)
31+
if !semver.IsValid(c) {
32+
return false, slackerror.New(slackerror.ErrInvalidSemVer).
33+
WithMessage("Value %s is not a semantic version", current)
3134
}
32-
return releaseVersion.GreaterThan(currentVersion), nil
35+
return semver.Compare(r, c) > 0, nil
3336
}
3437

3538
// SemVerLessThan returns true if release is less than current
3639
func SemVerLessThan(release string, current string) (bool, error) {
37-
releaseVersion, err := version.NewVersion(release)
38-
if err != nil {
39-
return false, slackerror.New(slackerror.ErrInvalidSemVer).WithRootCause(err)
40+
r := ensureVPrefix(release)
41+
c := ensureVPrefix(current)
42+
if !semver.IsValid(r) {
43+
return false, slackerror.New(slackerror.ErrInvalidSemVer).
44+
WithMessage("Value %s is not a semantic version", release)
45+
}
46+
if !semver.IsValid(c) {
47+
return false, slackerror.New(slackerror.ErrInvalidSemVer).
48+
WithMessage("Value %s is not a semantic version", current)
4049
}
41-
currentVersion, err := version.NewVersion(current)
42-
if err != nil {
43-
return false, slackerror.New(slackerror.ErrInvalidSemVer).WithRootCause(err)
50+
return semver.Compare(r, c) < 0, nil
51+
}
52+
53+
func ensureVPrefix(v string) string {
54+
if len(v) > 0 && v[0] != 'v' {
55+
return "v" + v
4456
}
45-
return releaseVersion.LessThan(currentVersion), nil
57+
return v
4658
}

test/testutil/testutil.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@ package testutil
1717
import (
1818
"regexp"
1919

20-
"github.com/hashicorp/go-version"
2120
"github.com/slackapi/slack-cli/internal/iostreams"
2221
"github.com/spf13/cobra"
22+
"golang.org/x/mod/semver"
2323
)
2424

2525
// package + .test for root command
2626
var rootName string = "cmd.test"
2727

2828
// ContainsSemVer checks if a string contains valid semver
2929
func ContainsSemVer(s string) bool {
30-
matcher := regexp.MustCompile(version.SemverRegexpRaw)
31-
match := matcher.MatchString(s)
32-
return match
30+
if semver.IsValid("v"+s) || semver.IsValid(s) {
31+
return true
32+
}
33+
matcher := regexp.MustCompile(`[0-9]+\.[0-9]+\.[0-9]+`)
34+
return matcher.MatchString(s)
3335
}
3436

3537
// Set the command's IOStream to the mocked IOStream

0 commit comments

Comments
 (0)