@@ -182,28 +182,45 @@ func isWildcardVersion(version string) bool {
182182 return strings .Contains (version , ".x" ) || strings .Contains (version , ".X" )
183183}
184184
185+ func normalizeLeadingV (version string ) string {
186+ if version == "" {
187+ return version
188+ }
189+ if version [0 ] == 'v' || version [0 ] == 'V' {
190+ return version [1 :]
191+ }
192+ return version
193+ }
194+
185195func VersionStringToRequirements (version string ) ([]types.VersionRequirement , error ) {
186- if isExactVersion (version ) {
196+ original := version
197+ normalized := normalizeLeadingV (version )
198+ originalHasV := len (original ) > 0 && (original [0 ] == 'v' || original [0 ] == 'V' )
199+ if isExactVersion (normalized ) {
187200 return []types.VersionRequirement {{
188201 types .VersionRequirementComparatorKey : "eq" ,
189- types .VersionRequirementVersionKey : version ,
202+ types .VersionRequirementVersionKey : normalized ,
190203 }}, nil
191204 }
192205
193- if ! isWildcardVersion (version ) {
206+ if ! isWildcardVersion (normalized ) {
194207 // Ask the Platform to translate a string like ">=1.2,<1.3" into a list of requirements.
195208 // Note that:
196209 // - The given requirement name does not matter; it is not looked up.
197- changeset , err := reqsimport .Init ().Changeset ([]byte ("name " + version ), "" , "" , "" )
210+ changeset , err := reqsimport .Init ().Changeset ([]byte ("name " + normalized ), "" , "" , "" )
198211 if err != nil {
199212 return nil , locale .WrapInputError (err , "err_invalid_version_string" , "Invalid version string" )
200213 }
201214 requirements := []types.VersionRequirement {}
202215 for _ , change := range changeset {
203216 for _ , constraint := range change .VersionConstraints {
217+ vr := constraint .Version
218+ if originalHasV && vr != "" && vr [0 ] != 'v' && vr [0 ] != 'V' {
219+ vr = "v" + vr
220+ }
204221 requirements = append (requirements , types.VersionRequirement {
205222 types .VersionRequirementComparatorKey : constraint .Comparator ,
206- types .VersionRequirementVersionKey : constraint . Version ,
223+ types .VersionRequirementVersionKey : vr ,
207224 })
208225 }
209226 }
@@ -214,26 +231,34 @@ func VersionStringToRequirements(version string) ([]types.VersionRequirement, er
214231 // For example, given a version number of 3.10.x, constraints should be >= 3.10, < 3.11.
215232 // Given 2.x, constraints should be >= 2, < 3.
216233 requirements := []types.VersionRequirement {}
217- parts := strings .Split (version , "." )
234+ parts := strings .Split (normalized , "." )
218235 for i , part := range parts {
219236 if part != "x" && part != "X" {
220237 continue
221238 }
222239 if i == 0 {
223240 return nil , locale .NewInputError ("err_version_wildcard_start" , "A version number cannot start with a wildcard" )
224241 }
242+ gte := strings .Join (parts [:i ], "." )
243+ if originalHasV {
244+ gte = "v" + gte
245+ }
225246 requirements = append (requirements , types.VersionRequirement {
226247 types .VersionRequirementComparatorKey : types .ComparatorGTE ,
227- types .VersionRequirementVersionKey : strings . Join ( parts [: i ], "." ) ,
248+ types .VersionRequirementVersionKey : gte ,
228249 })
229250 previousPart , err := strconv .Atoi (parts [i - 1 ])
230251 if err != nil {
231252 return nil , locale .WrapInputError (err , "err_version_number_expected" , "Version parts are expected to be numeric" )
232253 }
233254 parts [i - 1 ] = strconv .Itoa (previousPart + 1 )
255+ lt := strings .Join (parts [:i ], "." )
256+ if originalHasV {
257+ lt = "v" + lt
258+ }
234259 requirements = append (requirements , types.VersionRequirement {
235260 types .VersionRequirementComparatorKey : types .ComparatorLT ,
236- types .VersionRequirementVersionKey : strings . Join ( parts [: i ], "." ) ,
261+ types .VersionRequirementVersionKey : lt ,
237262 })
238263 }
239264 return requirements , nil
0 commit comments