@@ -7,39 +7,37 @@ import (
77 "strings"
88)
99
10- var constraintRegex = regexp .MustCompile (`^(?:(>=|>|<=|<|!=|==?)\s*)?(.+)$` )
10+ var constraintRegex = regexp .MustCompile (`^\s* (?:(>=|>|<=|<|!=|==?)\s*)?(.+)\s* $` )
1111
12- type constraintFunc func (a , b * Version ) bool
13- type constraint struct {
14- f constraintFunc
15- b * Version
16- original string
17- }
18-
19- // Constraints is a collection of version constraint rules that can be checked against a version.
20- type Constraints []constraint
12+ type (
13+ constraintFunc func (a , b * Version ) bool
14+ constraintSegment struct {
15+ f constraintFunc
16+ b * Version
17+ }
18+ Constraint struct {
19+ segments []constraintSegment
20+ original string
21+ }
22+ )
2123
22- // NewConstraint parses a string into a Constraints object that can be used to check
23- // if a given version satisfies the constraint.
24- func NewConstraint ( cs string ) ( Constraints , error ) {
24+ // NewConstraint parses a string and returns a Contraint and an error if the parsing fails.
25+ func NewConstraint ( cs string ) ( Constraint , error ) {
26+ c := Constraint { original : cs }
2527 parts := strings .Split (cs , "," )
26- newC := make (Constraints , len (parts ))
27- for i , p := range parts {
28- parts [i ] = strings .TrimSpace (p )
29- }
30- for i , p := range parts {
31- c , err := newConstraint (p )
28+ for _ , p := range parts {
29+ segments , err := parseSegment (p )
3230 if err != nil {
33- return Constraints {} , err
31+ return c , err
3432 }
35- newC [ i ] = c
33+ c . segments = append ( c . segments , segments ... )
3634 }
3735
38- return newC , nil
36+ return c , nil
3937}
4038
4139// MustConstraint is like NewConstraint but panics if the constraint is invalid.
42- func MustConstraint (cs string ) Constraints {
40+ func MustConstraint (cs string ) Constraint {
4341 c , err := NewConstraint (cs )
4442 if err != nil {
4543 panic ("github.com/k0sproject/version: NewConstraint: " + err .Error ())
@@ -48,17 +46,13 @@ func MustConstraint(cs string) Constraints {
4846}
4947
5048// String returns the constraint as a string.
51- func (cs Constraints ) String () string {
52- s := make ([]string , len (cs ))
53- for i , c := range cs {
54- s [i ] = c .String ()
55- }
56- return strings .Join (s , ", " )
49+ func (cs Constraint ) String () string {
50+ return cs .original
5751}
5852
5953// Check returns true if the given version satisfies all of the constraints.
60- func (cs Constraints ) Check (v * Version ) bool {
61- for _ , c := range cs {
54+ func (cs Constraint ) Check (v * Version ) bool {
55+ for _ , c := range cs . segments {
6256 if c .b .Prerelease () == "" && v .Prerelease () != "" {
6357 return false
6458 }
@@ -72,61 +66,56 @@ func (cs Constraints) Check(v *Version) bool {
7266
7367// CheckString is like Check but takes a string version. If the version is invalid,
7468// it returns false.
75- func (cs Constraints ) CheckString (v string ) bool {
69+ func (cs Constraint ) CheckString (v string ) bool {
7670 vv , err := NewVersion (v )
7771 if err != nil {
7872 return false
7973 }
8074 return cs .Check (vv )
8175}
8276
83- // String returns the original constraint string.
84- func (c * constraint ) String () string {
85- return c .original
86- }
87-
88- func newConstraint (s string ) (constraint , error ) {
77+ func parseSegment (s string ) ([]constraintSegment , error ) {
8978 match := constraintRegex .FindStringSubmatch (s )
9079 if len (match ) != 3 {
91- return constraint {} , errors .New ("invalid constraint: " + s )
80+ return nil , errors .New ("invalid constraint: " + s )
9281 }
9382
9483 op := match [1 ]
9584 f , err := opfunc (op )
9685 if err != nil {
97- return constraint {} , err
86+ return nil , err
9887 }
9988
10089 // convert one or two digit constraints to threes digit unless it's an equality operation
10190 if op != "" && op != "=" && op != "==" {
102- segments := strings .Split (match [2 ], "." )
103- if len (segments ) < 3 {
104- lastSegment := segments [len (segments )- 1 ]
91+ vSegments := strings .Split (match [2 ], "." )
92+ if len (vSegments ) < 3 {
93+ lastSegment := vSegments [len (vSegments )- 1 ]
10594 var pre string
10695 if strings .Contains (lastSegment , "-" ) {
10796 parts := strings .Split (lastSegment , "-" )
108- segments [len (segments )- 1 ] = parts [0 ]
97+ vSegments [len (vSegments )- 1 ] = parts [0 ]
10998 pre = "-" + parts [1 ]
11099 }
111- switch len (segments ) {
100+ switch len (vSegments ) {
112101 case 1 :
113102 // >= 1 becomes >= 1.0.0
114103 // >= 1-rc.1 becomes >= 1.0.0-rc.1
115- return newConstraint (fmt .Sprintf ("%s %s.0.0%s" , op , segments [0 ], pre ))
104+ return parseSegment (fmt .Sprintf ("%s %s.0.0%s" , op , vSegments [0 ], pre ))
116105 case 2 :
117106 // >= 1.1 becomes >= 1.1.0
118107 // >= 1.1-rc.1 becomes >= 1.1.0-rc.1
119- return newConstraint (fmt .Sprintf ("%s %s.%s.0%s" , op , segments [0 ], segments [1 ], pre ))
108+ return parseSegment (fmt .Sprintf ("%s %s.%s.0%s" , op , vSegments [0 ], vSegments [1 ], pre ))
120109 }
121110 }
122111 }
123112
124113 target , err := NewVersion (match [2 ])
125114 if err != nil {
126- return constraint {} , err
115+ return nil , err
127116 }
128117
129- return constraint { f : f , b : target , original : s }, nil
118+ return [] constraintSegment {{ f : f , b : target } }, nil
130119}
131120
132121func opfunc (s string ) (constraintFunc , error ) {
@@ -154,4 +143,3 @@ func gte(a, b *Version) bool { return b.GreaterThanOrEqual(a) }
154143func lte (a , b * Version ) bool { return b .LessThanOrEqual (a ) }
155144func eq (a , b * Version ) bool { return b .Equal (a ) }
156145func neq (a , b * Version ) bool { return ! b .Equal (a ) }
157-
0 commit comments