Skip to content

Commit 2841447

Browse files
committed
Update version number support
1 parent 4055f0f commit 2841447

1 file changed

Lines changed: 33 additions & 8 deletions

File tree

pkg/platform/model/buildplanner/build.go

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
185195
func 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

Comments
 (0)