@@ -52,11 +52,11 @@ func LatestVersion(versions []string) (string, error) {
5252func 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
10199func 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
0 commit comments