Browse code

vendor: add go-semver

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>

Aaron Lehmann authored on 2017/07/08 08:42:14
Showing 5 changed files
... ...
@@ -43,6 +43,7 @@ github.com/BurntSushi/toml f706d00e3de6abe700c994cdd545a1a4915af060
43 43
 github.com/samuel/go-zookeeper d0e0d8e11f318e000a8cc434616d69e329edc374
44 44
 github.com/deckarep/golang-set ef32fa3046d9f249d399f98ebaf9be944430fd1d
45 45
 github.com/coreos/etcd v3.2.1
46
+github.com/coreos/go-semver v0.2.0
46 47
 github.com/ugorji/go f1f1a805ed361a0e078bb537e4ea78cd37dcf065
47 48
 github.com/hashicorp/consul v0.5.2
48 49
 github.com/boltdb/bolt fff57c100f4dea1905678da7e90d92429dff2904
49 50
new file mode 100644
... ...
@@ -0,0 +1,202 @@
0
+
1
+                                 Apache License
2
+                           Version 2.0, January 2004
3
+                        http://www.apache.org/licenses/
4
+
5
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+   1. Definitions.
8
+
9
+      "License" shall mean the terms and conditions for use, reproduction,
10
+      and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+      "Licensor" shall mean the copyright owner or entity authorized by
13
+      the copyright owner that is granting the License.
14
+
15
+      "Legal Entity" shall mean the union of the acting entity and all
16
+      other entities that control, are controlled by, or are under common
17
+      control with that entity. For the purposes of this definition,
18
+      "control" means (i) the power, direct or indirect, to cause the
19
+      direction or management of such entity, whether by contract or
20
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+      outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+      "You" (or "Your") shall mean an individual or Legal Entity
24
+      exercising permissions granted by this License.
25
+
26
+      "Source" form shall mean the preferred form for making modifications,
27
+      including but not limited to software source code, documentation
28
+      source, and configuration files.
29
+
30
+      "Object" form shall mean any form resulting from mechanical
31
+      transformation or translation of a Source form, including but
32
+      not limited to compiled object code, generated documentation,
33
+      and conversions to other media types.
34
+
35
+      "Work" shall mean the work of authorship, whether in Source or
36
+      Object form, made available under the License, as indicated by a
37
+      copyright notice that is included in or attached to the work
38
+      (an example is provided in the Appendix below).
39
+
40
+      "Derivative Works" shall mean any work, whether in Source or Object
41
+      form, that is based on (or derived from) the Work and for which the
42
+      editorial revisions, annotations, elaborations, or other modifications
43
+      represent, as a whole, an original work of authorship. For the purposes
44
+      of this License, Derivative Works shall not include works that remain
45
+      separable from, or merely link (or bind by name) to the interfaces of,
46
+      the Work and Derivative Works thereof.
47
+
48
+      "Contribution" shall mean any work of authorship, including
49
+      the original version of the Work and any modifications or additions
50
+      to that Work or Derivative Works thereof, that is intentionally
51
+      submitted to Licensor for inclusion in the Work by the copyright owner
52
+      or by an individual or Legal Entity authorized to submit on behalf of
53
+      the copyright owner. For the purposes of this definition, "submitted"
54
+      means any form of electronic, verbal, or written communication sent
55
+      to the Licensor or its representatives, including but not limited to
56
+      communication on electronic mailing lists, source code control systems,
57
+      and issue tracking systems that are managed by, or on behalf of, the
58
+      Licensor for the purpose of discussing and improving the Work, but
59
+      excluding communication that is conspicuously marked or otherwise
60
+      designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+      "Contributor" shall mean Licensor and any individual or Legal Entity
63
+      on behalf of whom a Contribution has been received by Licensor and
64
+      subsequently incorporated within the Work.
65
+
66
+   2. Grant of Copyright License. Subject to the terms and conditions of
67
+      this License, each Contributor hereby grants to You a perpetual,
68
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+      copyright license to reproduce, prepare Derivative Works of,
70
+      publicly display, publicly perform, sublicense, and distribute the
71
+      Work and such Derivative Works in Source or Object form.
72
+
73
+   3. Grant of Patent License. Subject to the terms and conditions of
74
+      this License, each Contributor hereby grants to You a perpetual,
75
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+      (except as stated in this section) patent license to make, have made,
77
+      use, offer to sell, sell, import, and otherwise transfer the Work,
78
+      where such license applies only to those patent claims licensable
79
+      by such Contributor that are necessarily infringed by their
80
+      Contribution(s) alone or by combination of their Contribution(s)
81
+      with the Work to which such Contribution(s) was submitted. If You
82
+      institute patent litigation against any entity (including a
83
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+      or a Contribution incorporated within the Work constitutes direct
85
+      or contributory patent infringement, then any patent licenses
86
+      granted to You under this License for that Work shall terminate
87
+      as of the date such litigation is filed.
88
+
89
+   4. Redistribution. You may reproduce and distribute copies of the
90
+      Work or Derivative Works thereof in any medium, with or without
91
+      modifications, and in Source or Object form, provided that You
92
+      meet the following conditions:
93
+
94
+      (a) You must give any other recipients of the Work or
95
+          Derivative Works a copy of this License; and
96
+
97
+      (b) You must cause any modified files to carry prominent notices
98
+          stating that You changed the files; and
99
+
100
+      (c) You must retain, in the Source form of any Derivative Works
101
+          that You distribute, all copyright, patent, trademark, and
102
+          attribution notices from the Source form of the Work,
103
+          excluding those notices that do not pertain to any part of
104
+          the Derivative Works; and
105
+
106
+      (d) If the Work includes a "NOTICE" text file as part of its
107
+          distribution, then any Derivative Works that You distribute must
108
+          include a readable copy of the attribution notices contained
109
+          within such NOTICE file, excluding those notices that do not
110
+          pertain to any part of the Derivative Works, in at least one
111
+          of the following places: within a NOTICE text file distributed
112
+          as part of the Derivative Works; within the Source form or
113
+          documentation, if provided along with the Derivative Works; or,
114
+          within a display generated by the Derivative Works, if and
115
+          wherever such third-party notices normally appear. The contents
116
+          of the NOTICE file are for informational purposes only and
117
+          do not modify the License. You may add Your own attribution
118
+          notices within Derivative Works that You distribute, alongside
119
+          or as an addendum to the NOTICE text from the Work, provided
120
+          that such additional attribution notices cannot be construed
121
+          as modifying the License.
122
+
123
+      You may add Your own copyright statement to Your modifications and
124
+      may provide additional or different license terms and conditions
125
+      for use, reproduction, or distribution of Your modifications, or
126
+      for any such Derivative Works as a whole, provided Your use,
127
+      reproduction, and distribution of the Work otherwise complies with
128
+      the conditions stated in this License.
129
+
130
+   5. Submission of Contributions. Unless You explicitly state otherwise,
131
+      any Contribution intentionally submitted for inclusion in the Work
132
+      by You to the Licensor shall be under the terms and conditions of
133
+      this License, without any additional terms or conditions.
134
+      Notwithstanding the above, nothing herein shall supersede or modify
135
+      the terms of any separate license agreement you may have executed
136
+      with Licensor regarding such Contributions.
137
+
138
+   6. Trademarks. This License does not grant permission to use the trade
139
+      names, trademarks, service marks, or product names of the Licensor,
140
+      except as required for reasonable and customary use in describing the
141
+      origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+   7. Disclaimer of Warranty. Unless required by applicable law or
144
+      agreed to in writing, Licensor provides the Work (and each
145
+      Contributor provides its Contributions) on an "AS IS" BASIS,
146
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+      implied, including, without limitation, any warranties or conditions
148
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+      PARTICULAR PURPOSE. You are solely responsible for determining the
150
+      appropriateness of using or redistributing the Work and assume any
151
+      risks associated with Your exercise of permissions under this License.
152
+
153
+   8. Limitation of Liability. In no event and under no legal theory,
154
+      whether in tort (including negligence), contract, or otherwise,
155
+      unless required by applicable law (such as deliberate and grossly
156
+      negligent acts) or agreed to in writing, shall any Contributor be
157
+      liable to You for damages, including any direct, indirect, special,
158
+      incidental, or consequential damages of any character arising as a
159
+      result of this License or out of the use or inability to use the
160
+      Work (including but not limited to damages for loss of goodwill,
161
+      work stoppage, computer failure or malfunction, or any and all
162
+      other commercial damages or losses), even if such Contributor
163
+      has been advised of the possibility of such damages.
164
+
165
+   9. Accepting Warranty or Additional Liability. While redistributing
166
+      the Work or Derivative Works thereof, You may choose to offer,
167
+      and charge a fee for, acceptance of support, warranty, indemnity,
168
+      or other liability obligations and/or rights consistent with this
169
+      License. However, in accepting such obligations, You may act only
170
+      on Your own behalf and on Your sole responsibility, not on behalf
171
+      of any other Contributor, and only if You agree to indemnify,
172
+      defend, and hold each Contributor harmless for any liability
173
+      incurred by, or claims asserted against, such Contributor by reason
174
+      of your accepting any such warranty or additional liability.
175
+
176
+   END OF TERMS AND CONDITIONS
177
+
178
+   APPENDIX: How to apply the Apache License to your work.
179
+
180
+      To apply the Apache License to your work, attach the following
181
+      boilerplate notice, with the fields enclosed by brackets "[]"
182
+      replaced with your own identifying information. (Don't include
183
+      the brackets!)  The text should be enclosed in the appropriate
184
+      comment syntax for the file format. We also recommend that a
185
+      file or class name and description of purpose be included on the
186
+      same "printed page" as the copyright notice for easier
187
+      identification within third-party archives.
188
+
189
+   Copyright [yyyy] [name of copyright owner]
190
+
191
+   Licensed under the Apache License, Version 2.0 (the "License");
192
+   you may not use this file except in compliance with the License.
193
+   You may obtain a copy of the License at
194
+
195
+       http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+   Unless required by applicable law or agreed to in writing, software
198
+   distributed under the License is distributed on an "AS IS" BASIS,
199
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+   See the License for the specific language governing permissions and
201
+   limitations under the License.
0 202
new file mode 100644
... ...
@@ -0,0 +1,28 @@
0
+# go-semver - Semantic Versioning Library
1
+
2
+[![Build Status](https://travis-ci.org/coreos/go-semver.svg?branch=master)](https://travis-ci.org/coreos/go-semver)
3
+[![GoDoc](https://godoc.org/github.com/coreos/go-semver/semver?status.svg)](https://godoc.org/github.com/coreos/go-semver/semver)
4
+
5
+go-semver is a [semantic versioning][semver] library for Go. It lets you parse
6
+and compare two semantic version strings.
7
+
8
+[semver]: http://semver.org/
9
+
10
+## Usage
11
+
12
+```go
13
+vA := semver.New("1.2.3")
14
+vB := semver.New("3.2.1")
15
+
16
+fmt.Printf("%s < %s == %t\n", vA, vB, vA.LessThan(*vB))
17
+```
18
+
19
+## Example Application
20
+
21
+```
22
+$ go run example.go 1.2.3 3.2.1
23
+1.2.3 < 3.2.1 == true
24
+
25
+$ go run example.go 5.2.3 3.2.1
26
+5.2.3 < 3.2.1 == false
27
+```
0 28
new file mode 100644
... ...
@@ -0,0 +1,268 @@
0
+// Copyright 2013-2015 CoreOS, Inc.
1
+//
2
+// Licensed under the Apache License, Version 2.0 (the "License");
3
+// you may not use this file except in compliance with the License.
4
+// You may obtain a copy of the License at
5
+//
6
+//     http://www.apache.org/licenses/LICENSE-2.0
7
+//
8
+// Unless required by applicable law or agreed to in writing, software
9
+// distributed under the License is distributed on an "AS IS" BASIS,
10
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+// See the License for the specific language governing permissions and
12
+// limitations under the License.
13
+
14
+// Semantic Versions http://semver.org
15
+package semver
16
+
17
+import (
18
+	"bytes"
19
+	"errors"
20
+	"fmt"
21
+	"strconv"
22
+	"strings"
23
+)
24
+
25
+type Version struct {
26
+	Major      int64
27
+	Minor      int64
28
+	Patch      int64
29
+	PreRelease PreRelease
30
+	Metadata   string
31
+}
32
+
33
+type PreRelease string
34
+
35
+func splitOff(input *string, delim string) (val string) {
36
+	parts := strings.SplitN(*input, delim, 2)
37
+
38
+	if len(parts) == 2 {
39
+		*input = parts[0]
40
+		val = parts[1]
41
+	}
42
+
43
+	return val
44
+}
45
+
46
+func New(version string) *Version {
47
+	return Must(NewVersion(version))
48
+}
49
+
50
+func NewVersion(version string) (*Version, error) {
51
+	v := Version{}
52
+
53
+	if err := v.Set(version); err != nil {
54
+		return nil, err
55
+	}
56
+
57
+	return &v, nil
58
+}
59
+
60
+// Must is a helper for wrapping NewVersion and will panic if err is not nil.
61
+func Must(v *Version, err error) *Version {
62
+	if err != nil {
63
+		panic(err)
64
+	}
65
+	return v
66
+}
67
+
68
+// Set parses and updates v from the given version string. Implements flag.Value
69
+func (v *Version) Set(version string) error {
70
+	metadata := splitOff(&version, "+")
71
+	preRelease := PreRelease(splitOff(&version, "-"))
72
+	dotParts := strings.SplitN(version, ".", 3)
73
+
74
+	if len(dotParts) != 3 {
75
+		return fmt.Errorf("%s is not in dotted-tri format", version)
76
+	}
77
+
78
+	parsed := make([]int64, 3, 3)
79
+
80
+	for i, v := range dotParts[:3] {
81
+		val, err := strconv.ParseInt(v, 10, 64)
82
+		parsed[i] = val
83
+		if err != nil {
84
+			return err
85
+		}
86
+	}
87
+
88
+	v.Metadata = metadata
89
+	v.PreRelease = preRelease
90
+	v.Major = parsed[0]
91
+	v.Minor = parsed[1]
92
+	v.Patch = parsed[2]
93
+	return nil
94
+}
95
+
96
+func (v Version) String() string {
97
+	var buffer bytes.Buffer
98
+
99
+	fmt.Fprintf(&buffer, "%d.%d.%d", v.Major, v.Minor, v.Patch)
100
+
101
+	if v.PreRelease != "" {
102
+		fmt.Fprintf(&buffer, "-%s", v.PreRelease)
103
+	}
104
+
105
+	if v.Metadata != "" {
106
+		fmt.Fprintf(&buffer, "+%s", v.Metadata)
107
+	}
108
+
109
+	return buffer.String()
110
+}
111
+
112
+func (v *Version) UnmarshalYAML(unmarshal func(interface{}) error) error {
113
+	var data string
114
+	if err := unmarshal(&data); err != nil {
115
+		return err
116
+	}
117
+	return v.Set(data)
118
+}
119
+
120
+func (v Version) MarshalJSON() ([]byte, error) {
121
+	return []byte(`"` + v.String() + `"`), nil
122
+}
123
+
124
+func (v *Version) UnmarshalJSON(data []byte) error {
125
+	l := len(data)
126
+	if l == 0 || string(data) == `""` {
127
+		return nil
128
+	}
129
+	if l < 2 || data[0] != '"' || data[l-1] != '"' {
130
+		return errors.New("invalid semver string")
131
+	}
132
+	return v.Set(string(data[1 : l-1]))
133
+}
134
+
135
+// Compare tests if v is less than, equal to, or greater than versionB,
136
+// returning -1, 0, or +1 respectively.
137
+func (v Version) Compare(versionB Version) int {
138
+	if cmp := recursiveCompare(v.Slice(), versionB.Slice()); cmp != 0 {
139
+		return cmp
140
+	}
141
+	return preReleaseCompare(v, versionB)
142
+}
143
+
144
+// Equal tests if v is equal to versionB.
145
+func (v Version) Equal(versionB Version) bool {
146
+	return v.Compare(versionB) == 0
147
+}
148
+
149
+// LessThan tests if v is less than versionB.
150
+func (v Version) LessThan(versionB Version) bool {
151
+	return v.Compare(versionB) < 0
152
+}
153
+
154
+// Slice converts the comparable parts of the semver into a slice of integers.
155
+func (v Version) Slice() []int64 {
156
+	return []int64{v.Major, v.Minor, v.Patch}
157
+}
158
+
159
+func (p PreRelease) Slice() []string {
160
+	preRelease := string(p)
161
+	return strings.Split(preRelease, ".")
162
+}
163
+
164
+func preReleaseCompare(versionA Version, versionB Version) int {
165
+	a := versionA.PreRelease
166
+	b := versionB.PreRelease
167
+
168
+	/* Handle the case where if two versions are otherwise equal it is the
169
+	 * one without a PreRelease that is greater */
170
+	if len(a) == 0 && (len(b) > 0) {
171
+		return 1
172
+	} else if len(b) == 0 && (len(a) > 0) {
173
+		return -1
174
+	}
175
+
176
+	// If there is a prerelease, check and compare each part.
177
+	return recursivePreReleaseCompare(a.Slice(), b.Slice())
178
+}
179
+
180
+func recursiveCompare(versionA []int64, versionB []int64) int {
181
+	if len(versionA) == 0 {
182
+		return 0
183
+	}
184
+
185
+	a := versionA[0]
186
+	b := versionB[0]
187
+
188
+	if a > b {
189
+		return 1
190
+	} else if a < b {
191
+		return -1
192
+	}
193
+
194
+	return recursiveCompare(versionA[1:], versionB[1:])
195
+}
196
+
197
+func recursivePreReleaseCompare(versionA []string, versionB []string) int {
198
+	// A larger set of pre-release fields has a higher precedence than a smaller set,
199
+	// if all of the preceding identifiers are equal.
200
+	if len(versionA) == 0 {
201
+		if len(versionB) > 0 {
202
+			return -1
203
+		}
204
+		return 0
205
+	} else if len(versionB) == 0 {
206
+		// We're longer than versionB so return 1.
207
+		return 1
208
+	}
209
+
210
+	a := versionA[0]
211
+	b := versionB[0]
212
+
213
+	aInt := false
214
+	bInt := false
215
+
216
+	aI, err := strconv.Atoi(versionA[0])
217
+	if err == nil {
218
+		aInt = true
219
+	}
220
+
221
+	bI, err := strconv.Atoi(versionB[0])
222
+	if err == nil {
223
+		bInt = true
224
+	}
225
+
226
+	// Handle Integer Comparison
227
+	if aInt && bInt {
228
+		if aI > bI {
229
+			return 1
230
+		} else if aI < bI {
231
+			return -1
232
+		}
233
+	}
234
+
235
+	// Handle String Comparison
236
+	if a > b {
237
+		return 1
238
+	} else if a < b {
239
+		return -1
240
+	}
241
+
242
+	return recursivePreReleaseCompare(versionA[1:], versionB[1:])
243
+}
244
+
245
+// BumpMajor increments the Major field by 1 and resets all other fields to their default values
246
+func (v *Version) BumpMajor() {
247
+	v.Major += 1
248
+	v.Minor = 0
249
+	v.Patch = 0
250
+	v.PreRelease = PreRelease("")
251
+	v.Metadata = ""
252
+}
253
+
254
+// BumpMinor increments the Minor field by 1 and resets all other fields to their default values
255
+func (v *Version) BumpMinor() {
256
+	v.Minor += 1
257
+	v.Patch = 0
258
+	v.PreRelease = PreRelease("")
259
+	v.Metadata = ""
260
+}
261
+
262
+// BumpPatch increments the Patch field by 1 and resets all other fields to their default values
263
+func (v *Version) BumpPatch() {
264
+	v.Patch += 1
265
+	v.PreRelease = PreRelease("")
266
+	v.Metadata = ""
267
+}
0 268
new file mode 100644
... ...
@@ -0,0 +1,38 @@
0
+// Copyright 2013-2015 CoreOS, Inc.
1
+//
2
+// Licensed under the Apache License, Version 2.0 (the "License");
3
+// you may not use this file except in compliance with the License.
4
+// You may obtain a copy of the License at
5
+//
6
+//     http://www.apache.org/licenses/LICENSE-2.0
7
+//
8
+// Unless required by applicable law or agreed to in writing, software
9
+// distributed under the License is distributed on an "AS IS" BASIS,
10
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+// See the License for the specific language governing permissions and
12
+// limitations under the License.
13
+
14
+package semver
15
+
16
+import (
17
+	"sort"
18
+)
19
+
20
+type Versions []*Version
21
+
22
+func (s Versions) Len() int {
23
+	return len(s)
24
+}
25
+
26
+func (s Versions) Swap(i, j int) {
27
+	s[i], s[j] = s[j], s[i]
28
+}
29
+
30
+func (s Versions) Less(i, j int) bool {
31
+	return s[i].LessThan(*s[j])
32
+}
33
+
34
+// Sort sorts the given slice of Version
35
+func Sort(versions []*Version) {
36
+	sort.Sort(Versions(versions))
37
+}