Skip to content

Commit 7a40290

Browse files
Refactor version comparison to use semver library
Replaced custom version parsing logic with the Masterminds/semver library for improved accuracy and maintainability. Added the dependency to `go.mod` and updated related files accordingly. This change ensures better handling of semantic versioning edge cases.
1 parent 8f3ac6d commit 7a40290

4 files changed

Lines changed: 22 additions & 28 deletions

File tree

api/RestHandler.go

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package api
1818

1919
import (
2020
"encoding/json"
21+
"github.com/Masterminds/semver"
2122
util "github.com/devtron-labs/central-api/client"
2223
"github.com/devtron-labs/central-api/common"
2324
"github.com/devtron-labs/central-api/pkg"
@@ -259,36 +260,23 @@ func (impl *RestHandlerImpl) GetBuildpackMetadata(w http.ResponseWriter, r *http
259260

260261
// isVersionNewer compares two version strings and returns true if v1 is newer than v2
261262
func isVersionNewer(v1, v2 string) bool {
262-
// Remove 'v' prefix if present
263-
v1 = strings.TrimPrefix(v1, "v")
264-
v2 = strings.TrimPrefix(v2, "v")
265-
266-
// Split versions into components
267-
v1Parts := strings.Split(v1, ".")
268-
v2Parts := strings.Split(v2, ".")
263+
// Ensure 'v' prefix is present for semver parsing
264+
if !strings.HasPrefix(v1, "v") {
265+
v1 = "v" + v1
266+
}
267+
if !strings.HasPrefix(v2, "v") {
268+
v2 = "v" + v2
269+
}
269270

270-
// Compare each component
271-
for i := 0; i < len(v1Parts) && i < len(v2Parts); i++ {
272-
v1Num, err1 := strconv.Atoi(v1Parts[i])
273-
v2Num, err2 := strconv.Atoi(v2Parts[i])
271+
// Parse versions
272+
ver1, err1 := semver.NewVersion(v1)
273+
ver2, err2 := semver.NewVersion(v2)
274274

275-
// If parts aren't numeric, fall back to string comparison
276-
if err1 != nil || err2 != nil {
277-
if v1Parts[i] > v2Parts[i] {
278-
return true
279-
} else if v1Parts[i] < v2Parts[i] {
280-
return false
281-
}
282-
continue
283-
}
284-
285-
if v1Num > v2Num {
286-
return true
287-
} else if v1Num < v2Num {
288-
return false
289-
}
275+
// Fall back to string comparison if parsing fails
276+
if err1 != nil || err2 != nil {
277+
return strings.TrimPrefix(v1, "v") > strings.TrimPrefix(v2, "v")
290278
}
291279

292-
// If all compared components are equal, the longer version is newer
293-
return len(v1Parts) > len(v2Parts)
280+
// Compare using semver
281+
return ver1.GreaterThan(ver2)
294282
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/devtron-labs/central-api
33
go 1.18
44

55
require (
6+
github.com/Masterminds/semver v1.5.0
67
github.com/caarlos0/env v3.5.0+incompatible
78
github.com/devtron-labs/common-lib v0.0.16-0.20240318063710-69cb957d019a
89
github.com/go-pg/pg v6.15.1+incompatible

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ
3232
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
3333
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
3434
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
35+
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
36+
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
3537
github.com/aws/aws-sdk-go v1.44.116 h1:NpLIhcvLWXJZAEwvPj3TDHeqp7DleK6ZUVYyW01WNHY=
3638
github.com/aws/aws-sdk-go v1.44.116/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
3739
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=

vendor/modules.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ github.com/Azure/go-autorest/logger
4545
# github.com/Azure/go-autorest/tracing v0.6.0
4646
## explicit; go 1.12
4747
github.com/Azure/go-autorest/tracing
48+
# github.com/Masterminds/semver v1.5.0
49+
## explicit
50+
github.com/Masterminds/semver
4851
# github.com/aws/aws-sdk-go v1.44.116
4952
## explicit; go 1.11
5053
github.com/aws/aws-sdk-go/aws

0 commit comments

Comments
 (0)