mirror of
https://github.com/wahyd4/jabba.git
synced 2026-08-09 04:46:17 +10:00
127 lines
2.4 KiB
Go
127 lines
2.4 KiB
Go
package semver
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/Masterminds/semver"
|
|
"strings"
|
|
)
|
|
|
|
type Version struct {
|
|
qualifier string
|
|
raw string
|
|
ver *semver.Version
|
|
}
|
|
|
|
func (l *Version) LessThan(r *Version) bool {
|
|
if l.qualifier == r.qualifier {
|
|
return l.ver.LessThan(r.ver)
|
|
}
|
|
return l.qualifier > r.qualifier
|
|
}
|
|
|
|
func (l *Version) Equals(r *Version) bool {
|
|
return l.raw == r.raw
|
|
}
|
|
|
|
func (t *Version) String() string {
|
|
return t.raw
|
|
}
|
|
|
|
func (t *Version) TrimTo(part VersionPart) string {
|
|
prefix := t.qualifier
|
|
if prefix != "" {
|
|
prefix += "@"
|
|
}
|
|
switch part {
|
|
case VPMajor:
|
|
return fmt.Sprintf("%v%v", prefix, t.ver.Major())
|
|
case VPMinor:
|
|
return fmt.Sprintf("%v%v.%v", prefix, t.ver.Major(), t.ver.Minor())
|
|
case VPPatch:
|
|
return fmt.Sprintf("%v%v.%v.%v", prefix, t.ver.Major(), t.ver.Minor(), t.ver.Patch())
|
|
}
|
|
return t.raw
|
|
}
|
|
|
|
func (t *Version) Major() int64 {
|
|
return t.ver.Major()
|
|
}
|
|
|
|
func (t *Version) Minor() int64 {
|
|
return t.ver.Minor()
|
|
}
|
|
|
|
func (t *Version) Patch() int64 {
|
|
return t.ver.Patch()
|
|
}
|
|
|
|
func (t *Version) Prerelease() string {
|
|
return t.ver.Prerelease()
|
|
}
|
|
|
|
func ParseVersion(raw string) (*Version, error) {
|
|
p := new(Version)
|
|
p.raw = raw
|
|
// selector can be either <version> or <qualifier>@<version>
|
|
if strings.Contains(raw, "@") {
|
|
p.qualifier = raw[0:strings.Index(raw, "@")]
|
|
raw = raw[strings.Index(raw, "@")+1:]
|
|
}
|
|
parsed, err := semver.NewVersion(raw)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%s is not a valid version", raw)
|
|
}
|
|
p.ver = parsed
|
|
return p, nil
|
|
}
|
|
|
|
type VersionSlice []*Version
|
|
|
|
// impl sort.Interface:
|
|
|
|
func (c VersionSlice) Len() int {
|
|
return len(c)
|
|
}
|
|
func (c VersionSlice) Swap(i, j int) {
|
|
c[i], c[j] = c[j], c[i]
|
|
}
|
|
func (c VersionSlice) Less(i, j int) bool {
|
|
return c[i].LessThan(c[j])
|
|
}
|
|
|
|
type VersionPart int
|
|
|
|
const (
|
|
VPMajor VersionPart = iota
|
|
VPMinor
|
|
VPPatch
|
|
)
|
|
|
|
func (c VersionSlice) TrimTo(part VersionPart) VersionSlice {
|
|
var r []*Version
|
|
var pQualifier string
|
|
var pMajor, pMinor, pPatch int64
|
|
for _, v := range c {
|
|
switch part {
|
|
case VPMajor:
|
|
if pQualifier == v.qualifier && pMajor == v.Major() {
|
|
continue
|
|
}
|
|
case VPMinor:
|
|
if pQualifier == v.qualifier && pMajor == v.Major() && pMinor == v.Minor() {
|
|
continue
|
|
}
|
|
case VPPatch:
|
|
if pQualifier == v.qualifier && pMajor == v.Major() && pMinor == v.Minor() && pPatch == v.Patch() {
|
|
continue
|
|
}
|
|
}
|
|
pQualifier = v.qualifier
|
|
pMajor = v.Major()
|
|
pMinor = v.Minor()
|
|
pPatch = v.Patch()
|
|
r = append(r, v)
|
|
}
|
|
return r
|
|
}
|