mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Update semver to 3.5.0
This commit is contained in:
		
							
								
								
									
										4
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							@@ -308,8 +308,8 @@
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/blang/semver",
 | 
			
		||||
			"Comment": "v3.0.1",
 | 
			
		||||
			"Rev": "31b736133b98f26d5e078ec9eb591666edfd091f"
 | 
			
		||||
			"Comment": "v3.5.0",
 | 
			
		||||
			"Rev": "b38d23b8782a487059e8fc8773e9a5b228a77cb6"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/boltdb/bolt",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								vendor/github.com/blang/semver/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/blang/semver/BUILD
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,6 +11,7 @@ go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        "json.go",
 | 
			
		||||
        "range.go",
 | 
			
		||||
        "semver.go",
 | 
			
		||||
        "sort.go",
 | 
			
		||||
        "sql.go",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										77
									
								
								vendor/github.com/blang/semver/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/github.com/blang/semver/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -40,10 +40,52 @@ Features
 | 
			
		||||
- Comparator-like comparisons
 | 
			
		||||
- Compare Helper Methods
 | 
			
		||||
- InPlace manipulation
 | 
			
		||||
- Ranges `>=1.0.0 <2.0.0 || >=3.0.0 !3.0.1-beta.1`
 | 
			
		||||
- Sortable (implements sort.Interface)
 | 
			
		||||
- database/sql compatible (sql.Scanner/Valuer)
 | 
			
		||||
- encoding/json compatible (json.Marshaler/Unmarshaler)
 | 
			
		||||
 | 
			
		||||
Ranges
 | 
			
		||||
------
 | 
			
		||||
 | 
			
		||||
A `Range` is a set of conditions which specify which versions satisfy the range.
 | 
			
		||||
 | 
			
		||||
A condition is composed of an operator and a version. The supported operators are:
 | 
			
		||||
 | 
			
		||||
- `<1.0.0` Less than `1.0.0`
 | 
			
		||||
- `<=1.0.0` Less than or equal to `1.0.0`
 | 
			
		||||
- `>1.0.0` Greater than `1.0.0`
 | 
			
		||||
- `>=1.0.0` Greater than or equal to `1.0.0`
 | 
			
		||||
- `1.0.0`, `=1.0.0`, `==1.0.0` Equal to `1.0.0`
 | 
			
		||||
- `!1.0.0`, `!=1.0.0` Not equal to `1.0.0`. Excludes version `1.0.0`.
 | 
			
		||||
 | 
			
		||||
A `Range` can link multiple `Ranges` separated by space:
 | 
			
		||||
 | 
			
		||||
Ranges can be linked by logical AND:
 | 
			
		||||
 | 
			
		||||
  - `>1.0.0 <2.0.0` would match between both ranges, so `1.1.1` and `1.8.7` but not `1.0.0` or `2.0.0`
 | 
			
		||||
  - `>1.0.0 <3.0.0 !2.0.3-beta.2` would match every version between `1.0.0` and `3.0.0` except `2.0.3-beta.2`
 | 
			
		||||
 | 
			
		||||
Ranges can also be linked by logical OR:
 | 
			
		||||
 | 
			
		||||
  - `<2.0.0 || >=3.0.0` would match `1.x.x` and `3.x.x` but not `2.x.x`
 | 
			
		||||
 | 
			
		||||
AND has a higher precedence than OR. It's not possible to use brackets.
 | 
			
		||||
 | 
			
		||||
Ranges can be combined by both AND and OR
 | 
			
		||||
 | 
			
		||||
  - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1`
 | 
			
		||||
 | 
			
		||||
Range usage:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
v, err := semver.Parse("1.2.3")
 | 
			
		||||
range, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0")
 | 
			
		||||
if range(v) {
 | 
			
		||||
    //valid
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Example
 | 
			
		||||
-----
 | 
			
		||||
@@ -103,23 +145,30 @@ if err != nil {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Benchmarks
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
    BenchmarkParseSimple         5000000      328    ns/op    49 B/op   1 allocs/op
 | 
			
		||||
    BenchmarkParseComplex        1000000     2105    ns/op   263 B/op   7 allocs/op
 | 
			
		||||
    BenchmarkParseAverage        1000000     1301    ns/op   168 B/op   4 allocs/op
 | 
			
		||||
    BenchmarkStringSimple       10000000      130    ns/op     5 B/op   1 allocs/op
 | 
			
		||||
    BenchmarkStringLarger        5000000      280    ns/op    32 B/op   2 allocs/op
 | 
			
		||||
    BenchmarkStringComplex       3000000      512    ns/op    80 B/op   3 allocs/op
 | 
			
		||||
    BenchmarkStringAverage       5000000      387    ns/op    47 B/op   2 allocs/op
 | 
			
		||||
    BenchmarkValidateSimple    500000000        7.92 ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkValidateComplex     2000000      923    ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkValidateAverage     5000000      452    ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkCompareSimple     100000000       11.2  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkCompareComplex     50000000       40.9  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkCompareAverage     50000000       43.8  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkSort                5000000      436    ns/op   259 B/op   2 allocs/op
 | 
			
		||||
    BenchmarkParseSimple-4           5000000    390    ns/op    48 B/op   1 allocs/op
 | 
			
		||||
    BenchmarkParseComplex-4          1000000   1813    ns/op   256 B/op   7 allocs/op
 | 
			
		||||
    BenchmarkParseAverage-4          1000000   1171    ns/op   163 B/op   4 allocs/op
 | 
			
		||||
    BenchmarkStringSimple-4         20000000    119    ns/op    16 B/op   1 allocs/op
 | 
			
		||||
    BenchmarkStringLarger-4         10000000    206    ns/op    32 B/op   2 allocs/op
 | 
			
		||||
    BenchmarkStringComplex-4         5000000    324    ns/op    80 B/op   3 allocs/op
 | 
			
		||||
    BenchmarkStringAverage-4         5000000    273    ns/op    53 B/op   2 allocs/op
 | 
			
		||||
    BenchmarkValidateSimple-4      200000000      9.33 ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkValidateComplex-4       3000000    469    ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkValidateAverage-4       5000000    256    ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkCompareSimple-4       100000000     11.8  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkCompareComplex-4       50000000     30.8  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkCompareAverage-4       30000000     41.5  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkSort-4                  3000000    419    ns/op   256 B/op   2 allocs/op
 | 
			
		||||
    BenchmarkRangeParseSimple-4      2000000    850    ns/op   192 B/op   5 allocs/op
 | 
			
		||||
    BenchmarkRangeParseAverage-4     1000000   1677    ns/op   400 B/op  10 allocs/op
 | 
			
		||||
    BenchmarkRangeParseComplex-4      300000   5214    ns/op  1440 B/op  30 allocs/op
 | 
			
		||||
    BenchmarkRangeMatchSimple-4     50000000     25.6  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkRangeMatchAverage-4    30000000     56.4  ns/op     0 B/op   0 allocs/op
 | 
			
		||||
    BenchmarkRangeMatchComplex-4    10000000    153    ns/op     0 B/op   0 allocs/op
 | 
			
		||||
 | 
			
		||||
See benchmark cases at [semver_test.go](semver_test.go)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/blang/semver/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/blang/semver/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
{
 | 
			
		||||
  "author": "blang",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "URL": "https://github.com/blang/semver/issues",
 | 
			
		||||
    "url": "https://github.com/blang/semver/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "gx": {
 | 
			
		||||
    "dvcsimport": "github.com/blang/semver"
 | 
			
		||||
  },
 | 
			
		||||
  "gxVersion": "0.10.0",
 | 
			
		||||
  "language": "go",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "name": "semver",
 | 
			
		||||
  "releaseCmd": "git commit -a -m \"gx publish $VERSION\"",
 | 
			
		||||
  "version": "3.4.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										416
									
								
								vendor/github.com/blang/semver/range.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								vendor/github.com/blang/semver/range.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,416 @@
 | 
			
		||||
package semver
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"unicode"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type wildcardType int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	noneWildcard  wildcardType = iota
 | 
			
		||||
	majorWildcard wildcardType = 1
 | 
			
		||||
	minorWildcard wildcardType = 2
 | 
			
		||||
	patchWildcard wildcardType = 3
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func wildcardTypefromInt(i int) wildcardType {
 | 
			
		||||
	switch i {
 | 
			
		||||
	case 1:
 | 
			
		||||
		return majorWildcard
 | 
			
		||||
	case 2:
 | 
			
		||||
		return minorWildcard
 | 
			
		||||
	case 3:
 | 
			
		||||
		return patchWildcard
 | 
			
		||||
	default:
 | 
			
		||||
		return noneWildcard
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type comparator func(Version, Version) bool
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	compEQ comparator = func(v1 Version, v2 Version) bool {
 | 
			
		||||
		return v1.Compare(v2) == 0
 | 
			
		||||
	}
 | 
			
		||||
	compNE = func(v1 Version, v2 Version) bool {
 | 
			
		||||
		return v1.Compare(v2) != 0
 | 
			
		||||
	}
 | 
			
		||||
	compGT = func(v1 Version, v2 Version) bool {
 | 
			
		||||
		return v1.Compare(v2) == 1
 | 
			
		||||
	}
 | 
			
		||||
	compGE = func(v1 Version, v2 Version) bool {
 | 
			
		||||
		return v1.Compare(v2) >= 0
 | 
			
		||||
	}
 | 
			
		||||
	compLT = func(v1 Version, v2 Version) bool {
 | 
			
		||||
		return v1.Compare(v2) == -1
 | 
			
		||||
	}
 | 
			
		||||
	compLE = func(v1 Version, v2 Version) bool {
 | 
			
		||||
		return v1.Compare(v2) <= 0
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type versionRange struct {
 | 
			
		||||
	v Version
 | 
			
		||||
	c comparator
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// rangeFunc creates a Range from the given versionRange.
 | 
			
		||||
func (vr *versionRange) rangeFunc() Range {
 | 
			
		||||
	return Range(func(v Version) bool {
 | 
			
		||||
		return vr.c(v, vr.v)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Range represents a range of versions.
 | 
			
		||||
// A Range can be used to check if a Version satisfies it:
 | 
			
		||||
//
 | 
			
		||||
//     range, err := semver.ParseRange(">1.0.0 <2.0.0")
 | 
			
		||||
//     range(semver.MustParse("1.1.1") // returns true
 | 
			
		||||
type Range func(Version) bool
 | 
			
		||||
 | 
			
		||||
// OR combines the existing Range with another Range using logical OR.
 | 
			
		||||
func (rf Range) OR(f Range) Range {
 | 
			
		||||
	return Range(func(v Version) bool {
 | 
			
		||||
		return rf(v) || f(v)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AND combines the existing Range with another Range using logical AND.
 | 
			
		||||
func (rf Range) AND(f Range) Range {
 | 
			
		||||
	return Range(func(v Version) bool {
 | 
			
		||||
		return rf(v) && f(v)
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseRange parses a range and returns a Range.
 | 
			
		||||
// If the range could not be parsed an error is returned.
 | 
			
		||||
//
 | 
			
		||||
// Valid ranges are:
 | 
			
		||||
//   - "<1.0.0"
 | 
			
		||||
//   - "<=1.0.0"
 | 
			
		||||
//   - ">1.0.0"
 | 
			
		||||
//   - ">=1.0.0"
 | 
			
		||||
//   - "1.0.0", "=1.0.0", "==1.0.0"
 | 
			
		||||
//   - "!1.0.0", "!=1.0.0"
 | 
			
		||||
//
 | 
			
		||||
// A Range can consist of multiple ranges separated by space:
 | 
			
		||||
// Ranges can be linked by logical AND:
 | 
			
		||||
//   - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0"
 | 
			
		||||
//   - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2
 | 
			
		||||
//
 | 
			
		||||
// Ranges can also be linked by logical OR:
 | 
			
		||||
//   - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x"
 | 
			
		||||
//
 | 
			
		||||
// AND has a higher precedence than OR. It's not possible to use brackets.
 | 
			
		||||
//
 | 
			
		||||
// Ranges can be combined by both AND and OR
 | 
			
		||||
//
 | 
			
		||||
//  - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1`
 | 
			
		||||
func ParseRange(s string) (Range, error) {
 | 
			
		||||
	parts := splitAndTrim(s)
 | 
			
		||||
	orParts, err := splitORParts(parts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	expandedParts, err := expandWildcardVersion(orParts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	var orFn Range
 | 
			
		||||
	for _, p := range expandedParts {
 | 
			
		||||
		var andFn Range
 | 
			
		||||
		for _, ap := range p {
 | 
			
		||||
			opStr, vStr, err := splitComparatorVersion(ap)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			vr, err := buildVersionRange(opStr, vStr)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err)
 | 
			
		||||
			}
 | 
			
		||||
			rf := vr.rangeFunc()
 | 
			
		||||
 | 
			
		||||
			// Set function
 | 
			
		||||
			if andFn == nil {
 | 
			
		||||
				andFn = rf
 | 
			
		||||
			} else { // Combine with existing function
 | 
			
		||||
				andFn = andFn.AND(rf)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if orFn == nil {
 | 
			
		||||
			orFn = andFn
 | 
			
		||||
		} else {
 | 
			
		||||
			orFn = orFn.OR(andFn)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	return orFn, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// splitORParts splits the already cleaned parts by '||'.
 | 
			
		||||
// Checks for invalid positions of the operator and returns an
 | 
			
		||||
// error if found.
 | 
			
		||||
func splitORParts(parts []string) ([][]string, error) {
 | 
			
		||||
	var ORparts [][]string
 | 
			
		||||
	last := 0
 | 
			
		||||
	for i, p := range parts {
 | 
			
		||||
		if p == "||" {
 | 
			
		||||
			if i == 0 {
 | 
			
		||||
				return nil, fmt.Errorf("First element in range is '||'")
 | 
			
		||||
			}
 | 
			
		||||
			ORparts = append(ORparts, parts[last:i])
 | 
			
		||||
			last = i + 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if last == len(parts) {
 | 
			
		||||
		return nil, fmt.Errorf("Last element in range is '||'")
 | 
			
		||||
	}
 | 
			
		||||
	ORparts = append(ORparts, parts[last:])
 | 
			
		||||
	return ORparts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// buildVersionRange takes a slice of 2: operator and version
 | 
			
		||||
// and builds a versionRange, otherwise an error.
 | 
			
		||||
func buildVersionRange(opStr, vStr string) (*versionRange, error) {
 | 
			
		||||
	c := parseComparator(opStr)
 | 
			
		||||
	if c == nil {
 | 
			
		||||
		return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, ""))
 | 
			
		||||
	}
 | 
			
		||||
	v, err := Parse(vStr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &versionRange{
 | 
			
		||||
		v: v,
 | 
			
		||||
		c: c,
 | 
			
		||||
	}, nil
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// inArray checks if a byte is contained in an array of bytes
 | 
			
		||||
func inArray(s byte, list []byte) bool {
 | 
			
		||||
	for _, el := range list {
 | 
			
		||||
		if el == s {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// splitAndTrim splits a range string by spaces and cleans whitespaces
 | 
			
		||||
func splitAndTrim(s string) (result []string) {
 | 
			
		||||
	last := 0
 | 
			
		||||
	var lastChar byte
 | 
			
		||||
	excludeFromSplit := []byte{'>', '<', '='}
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) {
 | 
			
		||||
			if last < i-1 {
 | 
			
		||||
				result = append(result, s[last:i])
 | 
			
		||||
			}
 | 
			
		||||
			last = i + 1
 | 
			
		||||
		} else if s[i] != ' ' {
 | 
			
		||||
			lastChar = s[i]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if last < len(s)-1 {
 | 
			
		||||
		result = append(result, s[last:])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, v := range result {
 | 
			
		||||
		result[i] = strings.Replace(v, " ", "", -1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// parts := strings.Split(s, " ")
 | 
			
		||||
	// for _, x := range parts {
 | 
			
		||||
	// 	if s := strings.TrimSpace(x); len(s) != 0 {
 | 
			
		||||
	// 		result = append(result, s)
 | 
			
		||||
	// 	}
 | 
			
		||||
	// }
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// splitComparatorVersion splits the comparator from the version.
 | 
			
		||||
// Input must be free of leading or trailing spaces.
 | 
			
		||||
func splitComparatorVersion(s string) (string, string, error) {
 | 
			
		||||
	i := strings.IndexFunc(s, unicode.IsDigit)
 | 
			
		||||
	if i == -1 {
 | 
			
		||||
		return "", "", fmt.Errorf("Could not get version from string: %q", s)
 | 
			
		||||
	}
 | 
			
		||||
	return strings.TrimSpace(s[0:i]), s[i:], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getWildcardType will return the type of wildcard that the
 | 
			
		||||
// passed version contains
 | 
			
		||||
func getWildcardType(vStr string) wildcardType {
 | 
			
		||||
	parts := strings.Split(vStr, ".")
 | 
			
		||||
	nparts := len(parts)
 | 
			
		||||
	wildcard := parts[nparts-1]
 | 
			
		||||
 | 
			
		||||
	possibleWildcardType := wildcardTypefromInt(nparts)
 | 
			
		||||
	if wildcard == "x" {
 | 
			
		||||
		return possibleWildcardType
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return noneWildcard
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// createVersionFromWildcard will convert a wildcard version
 | 
			
		||||
// into a regular version, replacing 'x's with '0's, handling
 | 
			
		||||
// special cases like '1.x.x' and '1.x'
 | 
			
		||||
func createVersionFromWildcard(vStr string) string {
 | 
			
		||||
	// handle 1.x.x
 | 
			
		||||
	vStr2 := strings.Replace(vStr, ".x.x", ".x", 1)
 | 
			
		||||
	vStr2 = strings.Replace(vStr2, ".x", ".0", 1)
 | 
			
		||||
	parts := strings.Split(vStr2, ".")
 | 
			
		||||
 | 
			
		||||
	// handle 1.x
 | 
			
		||||
	if len(parts) == 2 {
 | 
			
		||||
		return vStr2 + ".0"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return vStr2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// incrementMajorVersion will increment the major version
 | 
			
		||||
// of the passed version
 | 
			
		||||
func incrementMajorVersion(vStr string) (string, error) {
 | 
			
		||||
	parts := strings.Split(vStr, ".")
 | 
			
		||||
	i, err := strconv.Atoi(parts[0])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	parts[0] = strconv.Itoa(i + 1)
 | 
			
		||||
 | 
			
		||||
	return strings.Join(parts, "."), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// incrementMajorVersion will increment the minor version
 | 
			
		||||
// of the passed version
 | 
			
		||||
func incrementMinorVersion(vStr string) (string, error) {
 | 
			
		||||
	parts := strings.Split(vStr, ".")
 | 
			
		||||
	i, err := strconv.Atoi(parts[1])
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	parts[1] = strconv.Itoa(i + 1)
 | 
			
		||||
 | 
			
		||||
	return strings.Join(parts, "."), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// expandWildcardVersion will expand wildcards inside versions
 | 
			
		||||
// following these rules:
 | 
			
		||||
//
 | 
			
		||||
// * when dealing with patch wildcards:
 | 
			
		||||
// >= 1.2.x    will become    >= 1.2.0
 | 
			
		||||
// <= 1.2.x    will become    <  1.3.0
 | 
			
		||||
// >  1.2.x    will become    >= 1.3.0
 | 
			
		||||
// <  1.2.x    will become    <  1.2.0
 | 
			
		||||
// != 1.2.x    will become    <  1.2.0 >= 1.3.0
 | 
			
		||||
//
 | 
			
		||||
// * when dealing with minor wildcards:
 | 
			
		||||
// >= 1.x      will become    >= 1.0.0
 | 
			
		||||
// <= 1.x      will become    <  2.0.0
 | 
			
		||||
// >  1.x      will become    >= 2.0.0
 | 
			
		||||
// <  1.0      will become    <  1.0.0
 | 
			
		||||
// != 1.x      will become    <  1.0.0 >= 2.0.0
 | 
			
		||||
//
 | 
			
		||||
// * when dealing with wildcards without
 | 
			
		||||
// version operator:
 | 
			
		||||
// 1.2.x       will become    >= 1.2.0 < 1.3.0
 | 
			
		||||
// 1.x         will become    >= 1.0.0 < 2.0.0
 | 
			
		||||
func expandWildcardVersion(parts [][]string) ([][]string, error) {
 | 
			
		||||
	var expandedParts [][]string
 | 
			
		||||
	for _, p := range parts {
 | 
			
		||||
		var newParts []string
 | 
			
		||||
		for _, ap := range p {
 | 
			
		||||
			if strings.Index(ap, "x") != -1 {
 | 
			
		||||
				opStr, vStr, err := splitComparatorVersion(ap)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				versionWildcardType := getWildcardType(vStr)
 | 
			
		||||
				flatVersion := createVersionFromWildcard(vStr)
 | 
			
		||||
 | 
			
		||||
				var resultOperator string
 | 
			
		||||
				var shouldIncrementVersion bool
 | 
			
		||||
				switch opStr {
 | 
			
		||||
				case ">":
 | 
			
		||||
					resultOperator = ">="
 | 
			
		||||
					shouldIncrementVersion = true
 | 
			
		||||
				case ">=":
 | 
			
		||||
					resultOperator = ">="
 | 
			
		||||
				case "<":
 | 
			
		||||
					resultOperator = "<"
 | 
			
		||||
				case "<=":
 | 
			
		||||
					resultOperator = "<"
 | 
			
		||||
					shouldIncrementVersion = true
 | 
			
		||||
				case "", "=", "==":
 | 
			
		||||
					newParts = append(newParts, ">="+flatVersion)
 | 
			
		||||
					resultOperator = "<"
 | 
			
		||||
					shouldIncrementVersion = true
 | 
			
		||||
				case "!=", "!":
 | 
			
		||||
					newParts = append(newParts, "<"+flatVersion)
 | 
			
		||||
					resultOperator = ">="
 | 
			
		||||
					shouldIncrementVersion = true
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				var resultVersion string
 | 
			
		||||
				if shouldIncrementVersion {
 | 
			
		||||
					switch versionWildcardType {
 | 
			
		||||
					case patchWildcard:
 | 
			
		||||
						resultVersion, _ = incrementMinorVersion(flatVersion)
 | 
			
		||||
					case minorWildcard:
 | 
			
		||||
						resultVersion, _ = incrementMajorVersion(flatVersion)
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					resultVersion = flatVersion
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				ap = resultOperator + resultVersion
 | 
			
		||||
			}
 | 
			
		||||
			newParts = append(newParts, ap)
 | 
			
		||||
		}
 | 
			
		||||
		expandedParts = append(expandedParts, newParts)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return expandedParts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseComparator(s string) comparator {
 | 
			
		||||
	switch s {
 | 
			
		||||
	case "==":
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case "":
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case "=":
 | 
			
		||||
		return compEQ
 | 
			
		||||
	case ">":
 | 
			
		||||
		return compGT
 | 
			
		||||
	case ">=":
 | 
			
		||||
		return compGE
 | 
			
		||||
	case "<":
 | 
			
		||||
		return compLT
 | 
			
		||||
	case "<=":
 | 
			
		||||
		return compLE
 | 
			
		||||
	case "!":
 | 
			
		||||
		fallthrough
 | 
			
		||||
	case "!=":
 | 
			
		||||
		return compNE
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MustParseRange is like ParseRange but panics if the range cannot be parsed.
 | 
			
		||||
func MustParseRange(s string) Range {
 | 
			
		||||
	r, err := ParseRange(s)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(`semver: ParseRange(` + s + `): ` + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	return r
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								vendor/github.com/blang/semver/semver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/blang/semver/semver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -200,6 +200,29 @@ func Make(s string) (Version, error) {
 | 
			
		||||
	return Parse(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseTolerant allows for certain version specifications that do not strictly adhere to semver
 | 
			
		||||
// specs to be parsed by this library. It does so by normalizing versions before passing them to
 | 
			
		||||
// Parse(). It currently trims spaces, removes a "v" prefix, and adds a 0 patch number to versions
 | 
			
		||||
// with only major and minor components specified
 | 
			
		||||
func ParseTolerant(s string) (Version, error) {
 | 
			
		||||
	s = strings.TrimSpace(s)
 | 
			
		||||
	s = strings.TrimPrefix(s, "v")
 | 
			
		||||
 | 
			
		||||
	// Split into major.minor.(patch+pr+meta)
 | 
			
		||||
	parts := strings.SplitN(s, ".", 3)
 | 
			
		||||
	if len(parts) < 3 {
 | 
			
		||||
		if strings.ContainsAny(parts[len(parts)-1], "+-") {
 | 
			
		||||
			return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data")
 | 
			
		||||
		}
 | 
			
		||||
		for len(parts) < 3 {
 | 
			
		||||
			parts = append(parts, "0")
 | 
			
		||||
		}
 | 
			
		||||
		s = strings.Join(parts, ".")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return Parse(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parse parses version string and returns a validated Version or error
 | 
			
		||||
func Parse(s string) (Version, error) {
 | 
			
		||||
	if len(s) == 0 {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user