package semver
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"strconv"
|
|
)
|
|
|
|
var SEMVER_SPEC_VERSION = Version{
|
|
Major: 2,
|
|
Minor: 0,
|
|
Patch: 0,
|
|
}
|
|
|
|
type Version struct {
|
|
Major int
|
|
Minor int
|
|
Patch int
|
|
Pre []PRVersion
|
|
Build []string //No Precendence
|
|
}
|
|
|
|
func (v Version) String() string {
|
|
var buf bytes.Buffer
|
|
var DOT = []byte(".")
|
|
var HYPHEN = []byte("-")
|
|
var PLUS = []byte("+")
|
|
buf.WriteString(strconv.Itoa(v.Major))
|
|
buf.Write(DOT)
|
|
buf.WriteString(strconv.Itoa(v.Minor))
|
|
buf.Write(DOT)
|
|
buf.WriteString(strconv.Itoa(v.Patch))
|
|
if len(v.Pre) > 0 {
|
|
buf.Write(HYPHEN)
|
|
for i, pre := range v.Pre {
|
|
if i > 0 {
|
|
buf.Write(DOT)
|
|
}
|
|
buf.WriteString(pre.String())
|
|
}
|
|
}
|
|
if len(v.Build) > 0 {
|
|
buf.Write(PLUS)
|
|
for i, build := range v.Build {
|
|
if i > 0 {
|
|
buf.Write(DOT)
|
|
}
|
|
buf.WriteString(build)
|
|
}
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
func (v *Version) compare(o *Version) int {
|
|
if v.Major != o.Major {
|
|
if v.Major > o.Major {
|
|
return 1
|
|
} else {
|
|
return -1
|
|
}
|
|
}
|
|
if v.Minor != o.Minor {
|
|
if v.Minor > o.Minor {
|
|
return 1
|
|
} else {
|
|
return -1
|
|
}
|
|
}
|
|
if v.Patch != o.Patch {
|
|
if v.Patch > o.Patch {
|
|
return 1
|
|
} else {
|
|
return -1
|
|
}
|
|
}
|
|
|
|
if len(v.Pre) == 0 && len(o.Pre) == 0 {
|
|
return 0
|
|
} else if len(v.Pre) == 0 && len(o.Pre) > 0 {
|
|
return -1
|
|
} else if len(v.Pre) > 0 && len(o.Pre) == 0 {
|
|
return 1
|
|
} else {
|
|
//Deep PreRelease Version comparison
|
|
|
|
return -2 //TODO: Not yet implemented
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func Parse(s string) (*Version, error) {
|
|
return nil, errors.New("Not implemented yet")
|
|
}
|
|
|
|
// PreRelease Version
|
|
type PRVersion interface {
|
|
compare(*PRVersion) int
|
|
String() string //fmt.Stringer
|
|
IsNumeric() bool
|
|
}
|
|
|
|
// Alphabetical PreRelease Version
|
|
type AlphaPRVersion struct {
|
|
Version string
|
|
}
|
|
|
|
func (v *AlphaPRVersion) IsNumeric() bool {
|
|
return false
|
|
}
|
|
|
|
func (v *AlphaPRVersion) compare(o *AlphaPRVersion) int {
|
|
if v.Version == o.Version {
|
|
return 0
|
|
} else if v.Version > o.Version {
|
|
return 1
|
|
} else {
|
|
return -1
|
|
}
|
|
}
|
|
|
|
func (v AlphaPRVersion) String() string {
|
|
return v.Version
|
|
}
|
|
|
|
// Numeric PreRelease Version
|
|
type NumPRVersion struct {
|
|
Version int
|
|
}
|
|
|
|
func (v *NumPRVersion) compare(o *NumPRVersion) int {
|
|
if v.Version == o.Version {
|
|
return 0
|
|
} else if v.Version > o.Version {
|
|
return 1
|
|
} else {
|
|
return -1
|
|
}
|
|
}
|
|
|
|
func (v NumPRVersion) String() string {
|
|
return strconv.Itoa(v.Version)
|
|
}
|
|
|
|
func (v *NumPRVersion) IsNumeric() bool {
|
|
return true
|
|
}
|