pip compatible server to serve Python packages out of GitHub
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

147 lines
2.3 KiB

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
}