From 019664cf9f2cc24b4cfc70247bcf691d399a5c95 Mon Sep 17 00:00:00 2001 From: matfax Date: Sat, 12 Jan 2019 16:48:57 +0100 Subject: [PATCH] feat: let ParseTolerant remove leading zeros from version digits Various vendors use versions with leading zeros (e.g., Docker, 18.09). Let semver accept them in its tolerant parser. --- semver.go | 13 ++++++++++--- semver_test.go | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/semver.go b/semver.go index ec26aa0..c1f6e73 100644 --- a/semver.go +++ b/semver.go @@ -202,14 +202,21 @@ func Make(s string) (Version, error) { // ParseTolerant allows for certain version specifications that do not strictly adhere to semver // specs to be parsed by this library. It does so by normalizing versions before passing them to -// Parse(). It currently trims spaces, removes a "v" prefix, and adds a 0 patch number to versions -// with only major and minor components specified +// Parse(). It currently trims spaces, removes a "v" prefix, adds a 0 patch number to versions +// with only major and minor components specified, and removes leading 0s. func ParseTolerant(s string) (Version, error) { s = strings.TrimSpace(s) s = strings.TrimPrefix(s, "v") // Split into major.minor.(patch+pr+meta) parts := strings.SplitN(s, ".", 3) + // Remove leading zeros. + for i, p := range parts { + if len(p) > 1 { + parts[i] = strings.TrimPrefix(p, "0") + } + } + // Fill up shortened versions. if len(parts) < 3 { if strings.ContainsAny(parts[len(parts)-1], "+-") { return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data") @@ -217,8 +224,8 @@ func ParseTolerant(s string) (Version, error) { for len(parts) < 3 { parts = append(parts, "0") } - s = strings.Join(parts, ".") } + s = strings.Join(parts, ".") return Parse(s) } diff --git a/semver_test.go b/semver_test.go index b3e1fd4..d37590b 100644 --- a/semver_test.go +++ b/semver_test.go @@ -33,6 +33,8 @@ var formatTests = []formatTest{ var tolerantFormatTests = []formatTest{ {Version{1, 2, 3, nil, nil}, "v1.2.3"}, {Version{1, 2, 3, nil, nil}, " 1.2.3 "}, + {Version{1, 2, 3, nil, nil}, "01.02.03"}, + {Version{0, 0, 3, nil, nil}, "00.0.03"}, {Version{1, 2, 0, nil, nil}, "1.2"}, {Version{1, 0, 0, nil, nil}, "1"}, }