]>
Commit | Line | Data |
---|---|---|
c680a8e1 RS |
1 | package discovery |
2 | ||
3 | import ( | |
4 | "fmt" | |
5 | "sort" | |
6 | ||
7 | version "github.com/hashicorp/go-version" | |
8 | ) | |
9 | ||
10 | const VersionZero = "0.0.0" | |
11 | ||
12 | // A VersionStr is a string containing a possibly-invalid representation | |
13 | // of a semver version number. Call Parse on it to obtain a real Version | |
14 | // object, or discover that it is invalid. | |
15 | type VersionStr string | |
16 | ||
17 | // Parse transforms a VersionStr into a Version if it is | |
18 | // syntactically valid. If it isn't then an error is returned instead. | |
19 | func (s VersionStr) Parse() (Version, error) { | |
20 | raw, err := version.NewVersion(string(s)) | |
21 | if err != nil { | |
22 | return Version{}, err | |
23 | } | |
24 | return Version{raw}, nil | |
25 | } | |
26 | ||
27 | // MustParse transforms a VersionStr into a Version if it is | |
28 | // syntactically valid. If it isn't then it panics. | |
29 | func (s VersionStr) MustParse() Version { | |
30 | ret, err := s.Parse() | |
31 | if err != nil { | |
32 | panic(err) | |
33 | } | |
34 | return ret | |
35 | } | |
36 | ||
37 | // Version represents a version number that has been parsed from | |
38 | // a semver string and known to be valid. | |
39 | type Version struct { | |
40 | // We wrap this here just because it avoids a proliferation of | |
41 | // direct go-version imports all over the place, and keeps the | |
42 | // version-processing details within this package. | |
43 | raw *version.Version | |
44 | } | |
45 | ||
46 | func (v Version) String() string { | |
47 | return v.raw.String() | |
48 | } | |
49 | ||
50 | func (v Version) NewerThan(other Version) bool { | |
51 | return v.raw.GreaterThan(other.raw) | |
52 | } | |
53 | ||
54 | func (v Version) Equal(other Version) bool { | |
55 | return v.raw.Equal(other.raw) | |
56 | } | |
57 | ||
107c1cdb ND |
58 | // IsPrerelease determines if version is a prerelease |
59 | func (v Version) IsPrerelease() bool { | |
60 | return v.raw.Prerelease() != "" | |
61 | } | |
62 | ||
c680a8e1 RS |
63 | // MinorUpgradeConstraintStr returns a ConstraintStr that would permit |
64 | // minor upgrades relative to the receiving version. | |
65 | func (v Version) MinorUpgradeConstraintStr() ConstraintStr { | |
66 | segments := v.raw.Segments() | |
67 | return ConstraintStr(fmt.Sprintf("~> %d.%d", segments[0], segments[1])) | |
68 | } | |
69 | ||
70 | type Versions []Version | |
71 | ||
72 | // Sort sorts version from newest to oldest. | |
73 | func (v Versions) Sort() { | |
74 | sort.Slice(v, func(i, j int) bool { | |
75 | return v[i].NewerThan(v[j]) | |
76 | }) | |
77 | } |