From e030971c62fe97f15360f1d6703b02f4082321c8 Mon Sep 17 00:00:00 2001 From: Benedikt Lang Date: Wed, 2 Jul 2014 12:50:29 +0200 Subject: [PATCH] Check for leading zeroes --- semver.go | 22 ++++++++++++++++++++++ semver_test.go | 11 +++++++++++ 2 files changed, 33 insertions(+) diff --git a/semver.go b/semver.go index 241890d..82b8223 100644 --- a/semver.go +++ b/semver.go @@ -189,6 +189,9 @@ func Parse(s string) (*Version, error) { if !containsOnly(parts[0], NUMBERS) { return nil, fmt.Errorf("Invalid character(s) found in major number %q", parts[0]) } + if hasLeadingZeroes(parts[0]) { + return nil, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0]) + } major, err := strconv.ParseUint(parts[0], 10, 64) if err != nil { return nil, err @@ -198,6 +201,9 @@ func Parse(s string) (*Version, error) { if !containsOnly(parts[1], NUMBERS) { return nil, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1]) } + if hasLeadingZeroes(parts[1]) { + return nil, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1]) + } minor, err := strconv.ParseUint(parts[1], 10, 64) if err != nil { return nil, err @@ -227,6 +233,9 @@ func Parse(s string) (*Version, error) { if !containsOnly(parts[2][:subVersionIndex], NUMBERS) { return nil, fmt.Errorf("Invalid character(s) found in patch number %q", parts[2][:subVersionIndex]) } + if hasLeadingZeroes(parts[2][:subVersionIndex]) { + return nil, fmt.Errorf("Patch number must not contain leading zeroes %q", parts[2][:subVersionIndex]) + } patch, err := strconv.ParseUint(parts[2][:subVersionIndex], 10, 64) if err != nil { return nil, err @@ -286,6 +295,9 @@ func NewPRVersion(s string) (*PRVersion, error) { } v := &PRVersion{} if containsOnly(s, NUMBERS) { + if hasLeadingZeroes(s) { + return nil, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s) + } num, err := strconv.ParseUint(s, 10, 64) // Might never be hit, but just in case @@ -350,6 +362,16 @@ func containsOnly(s string, set string) bool { }) == -1 } +func hasLeadingZeroes(s string) bool { + if len(s) <= 1 { + return false + } + if s[0] == '0' { + return true + } + return false +} + // Creates a new valid build version func NewBuildVersion(s string) (string, error) { if len(s) == 0 { diff --git a/semver_test.go b/semver_test.go index e7867f4..b4dc56b 100644 --- a/semver_test.go +++ b/semver_test.go @@ -129,6 +129,17 @@ var wrongformatTests = []wrongformatTest{ {nil, "-1.1.1"}, {nil, "1.-1.1"}, {nil, "1.1.-1"}, + // Leading zeroes + {nil, "01.1.1"}, + {nil, "001.1.1"}, + {nil, "1.01.1"}, + {nil, "1.001.1"}, + {nil, "1.1.01"}, + {nil, "1.1.001"}, + {nil, "1.1.1-01"}, + {nil, "1.1.1-001"}, + {nil, "1.1.1-beta.01"}, + {nil, "1.1.1-beta.001"}, {&Version{0, 0, 0, []*PRVersion{prstr("!")}, nil}, "0.0.0-!"}, {&Version{0, 0, 0, nil, []string{"!"}}, "0.0.0+!"}, // empty prversion