Browse Source

Simplify parsing by using more slices

Closes #7
Chris Bandy 11 years ago
committed by Benedikt Lang
parent
commit
fa1b4b2f13
1 changed files with 25 additions and 40 deletions
  1. +25
    -40
      semver.go

+ 25
- 40
semver.go View File

@ -231,52 +231,39 @@ func Parse(s string) (Version, error) {
return Version{}, err return Version{}, err
} }
preIndex := strings.Index(parts[2], "-")
buildIndex := strings.Index(parts[2], "+")
// Determine last index of patch version (first of pre or build versions)
var subVersionIndex int
if preIndex != -1 && buildIndex == -1 {
subVersionIndex = preIndex
} else if preIndex == -1 && buildIndex != -1 {
subVersionIndex = buildIndex
} else if preIndex == -1 && buildIndex == -1 {
subVersionIndex = len(parts[2])
} else {
// if there is no actual prversion but a hyphen inside the build meta data
if buildIndex < preIndex {
subVersionIndex = buildIndex
preIndex = -1 // Build meta data before preIndex found implicates there are no prerelease versions
} else {
subVersionIndex = preIndex
}
v := Version{}
v.Major = major
v.Minor = minor
var build, prerelease []string
patchStr := parts[2]
if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 {
build = strings.Split(patchStr[buildIndex+1:], ".")
patchStr = patchStr[:buildIndex]
} }
if !containsOnly(parts[2][:subVersionIndex], numbers) {
return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", parts[2][:subVersionIndex])
if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 {
prerelease = strings.Split(patchStr[preIndex+1:], ".")
patchStr = patchStr[:preIndex]
} }
if hasLeadingZeroes(parts[2][:subVersionIndex]) {
return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", parts[2][:subVersionIndex])
if !containsOnly(patchStr, numbers) {
return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr)
}
if hasLeadingZeroes(patchStr) {
return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr)
} }
patch, err := strconv.ParseUint(parts[2][:subVersionIndex], 10, 64)
patch, err := strconv.ParseUint(patchStr, 10, 64)
if err != nil { if err != nil {
return Version{}, err return Version{}, err
} }
v := Version{}
v.Major = major
v.Minor = minor
v.Patch = patch v.Patch = patch
// There are PreRelease versions // There are PreRelease versions
if preIndex != -1 {
var preRels string
if buildIndex != -1 {
preRels = parts[2][subVersionIndex+1 : buildIndex]
} else {
preRels = parts[2][subVersionIndex+1:]
}
prparts := strings.Split(preRels, ".")
for _, prstr := range prparts {
if len(prerelease) > 0 {
for _, prstr := range prerelease {
parsedPR, err := NewPRVersion(prstr) parsedPR, err := NewPRVersion(prstr)
if err != nil { if err != nil {
return Version{}, err return Version{}, err
@ -286,10 +273,8 @@ func Parse(s string) (Version, error) {
} }
// There is build meta data // There is build meta data
if buildIndex != -1 {
buildStr := parts[2][buildIndex+1:]
buildParts := strings.Split(buildStr, ".")
for _, str := range buildParts {
if len(build) > 0 {
for _, str := range build {
if len(str) == 0 { if len(str) == 0 {
return Version{}, errors.New("Build meta data is empty") return Version{}, errors.New("Build meta data is empty")
} }


Loading…
Cancel
Save