Skip to content

Commit 7fc8a5f

Browse files
authored
RTECO-1079 - Change the semver error response (#479)
1 parent a80257b commit 7fc8a5f

2 files changed

Lines changed: 19 additions & 10 deletions

File tree

agent/common/semver.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ func LatestVersion(versions []string) (string, error) {
5252
func CompareSemver(firstVersion, secondVersion string) (int, error) {
5353
firstVersionParts, err := parseSemver(strings.TrimSpace(firstVersion))
5454
if err != nil {
55-
return 0, fmt.Errorf("compare semver: invalid first version %q: %w", firstVersion, err)
55+
return 0, err
5656
}
5757
secondVersionParts, err := parseSemver(strings.TrimSpace(secondVersion))
5858
if err != nil {
59-
return 0, fmt.Errorf("compare semver: invalid second version %q: %w", secondVersion, err)
59+
return 0, err
6060
}
6161
if firstVersionParts.Major != secondVersionParts.Major {
6262
return firstVersionParts.Major - secondVersionParts.Major, nil
@@ -92,34 +92,32 @@ func ValidateSemver(version string) error {
9292
if strings.ContainsAny(version, "/\\") {
9393
return fmt.Errorf("invalid version %q: must not contain path separators", version)
9494
}
95-
if _, err := parseSemver(version); err != nil {
96-
return fmt.Errorf("invalid semver version %q: %w", version, err)
97-
}
98-
return nil
95+
_, err := parseSemver(version)
96+
return err
9997
}
10098

10199
func parseSemver(version string) (semverParts, error) {
102100
versionWithoutPrefix := strings.TrimPrefix(version, "v")
103101
versionSegments := strings.SplitN(versionWithoutPrefix, ".", 3)
104102
if len(versionSegments) != 3 {
105-
return semverParts{}, fmt.Errorf("invalid semver: %s", version)
103+
return semverParts{}, fmt.Errorf("invalid version %q: expected format major.minor.patch", version)
106104
}
107105

108106
major, err := strconv.Atoi(versionSegments[0])
109107
if err != nil {
110-
return semverParts{}, fmt.Errorf("invalid major version in %s: %w", version, err)
108+
return semverParts{}, fmt.Errorf("invalid version %q: major must be a number (got %q)", version, versionSegments[0])
111109
}
112110
minor, err := strconv.Atoi(versionSegments[1])
113111
if err != nil {
114-
return semverParts{}, fmt.Errorf("invalid minor version in %s: %w", version, err)
112+
return semverParts{}, fmt.Errorf("invalid version %q: minor must be a number (got %q)", version, versionSegments[1])
115113
}
116114

117115
// Patch may contain pre-release or build metadata; take numeric part only for comparison
118116
patchSegment := strings.SplitN(versionSegments[2], "-", 2)[0]
119117
patchSegment = strings.SplitN(patchSegment, "+", 2)[0]
120118
patch, err := strconv.Atoi(patchSegment)
121119
if err != nil {
122-
return semverParts{}, fmt.Errorf("invalid patch version in %s: %w", version, err)
120+
return semverParts{}, fmt.Errorf("invalid version %q: patch must be a number (got %q)", version, patchSegment)
123121
}
124122

125123
return semverParts{Major: major, Minor: minor, Patch: patch, Raw: version}, nil

agent/common/semver_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,17 @@ func TestValidateSemver(t *testing.T) {
9696
}
9797
}
9898

99+
func TestValidateSemver_ErrorMessageIsDirect(t *testing.T) {
100+
t.Parallel()
101+
err := ValidateSemver("1.9.e")
102+
require.Error(t, err)
103+
msg := err.Error()
104+
assert.Equal(t, `invalid version "1.9.e": patch must be a number (got "e")`, msg)
105+
assert.NotContains(t, msg, "strconv")
106+
assert.NotContains(t, msg, "invalid semver version")
107+
assert.NotContains(t, msg, "invalid patch version in")
108+
}
109+
99110
func TestNextMinorVersion(t *testing.T) {
100111
tests := []struct {
101112
name string

0 commit comments

Comments
 (0)