116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| /*
 | |
| Package semver provides the ability to work with Semantic Versions (http://semver.org) in Go.
 | |
| 
 | |
| Specifically it provides the ability to:
 | |
| 
 | |
|     * Parse semantic versions
 | |
|     * Sort semantic versions
 | |
|     * Check if a semantic version fits within a set of constraints
 | |
|     * Optionally work with a `v` prefix
 | |
| 
 | |
| Parsing Semantic Versions
 | |
| 
 | |
| To parse a semantic version use the `NewVersion` function. For example,
 | |
| 
 | |
|     v, err := semver.NewVersion("1.2.3-beta.1+build345")
 | |
| 
 | |
| If there is an error the version wasn't parseable. The version object has methods
 | |
| to get the parts of the version, compare it to other versions, convert the
 | |
| version back into a string, and get the original string. For more details
 | |
| please see the documentation at https://godoc.org/github.com/Masterminds/semver.
 | |
| 
 | |
| Sorting Semantic Versions
 | |
| 
 | |
| A set of versions can be sorted using the `sort` package from the standard library.
 | |
| For example,
 | |
| 
 | |
|     raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",}
 | |
|     vs := make([]*semver.Version, len(raw))
 | |
| 	for i, r := range raw {
 | |
| 		v, err := semver.NewVersion(r)
 | |
| 		if err != nil {
 | |
| 			t.Errorf("Error parsing version: %s", err)
 | |
| 		}
 | |
| 
 | |
| 		vs[i] = v
 | |
| 	}
 | |
| 
 | |
| 	sort.Sort(semver.Collection(vs))
 | |
| 
 | |
| Checking Version Constraints
 | |
| 
 | |
| Checking a version against version constraints is one of the most featureful
 | |
| parts of the package.
 | |
| 
 | |
|     c, err := semver.NewConstraint(">= 1.2.3")
 | |
|     if err != nil {
 | |
|         // Handle constraint not being parseable.
 | |
|     }
 | |
| 
 | |
|     v, _ := semver.NewVersion("1.3")
 | |
|     if err != nil {
 | |
|         // Handle version not being parseable.
 | |
|     }
 | |
|     // Check if the version meets the constraints. The a variable will be true.
 | |
|     a := c.Check(v)
 | |
| 
 | |
| Basic Comparisons
 | |
| 
 | |
| There are two elements to the comparisons. First, a comparison string is a list
 | |
| of comma separated and comparisons. These are then separated by || separated or
 | |
| comparisons. For example, `">= 1.2, < 3.0.0 || >= 4.2.3"` is looking for a
 | |
| comparison that's greater than or equal to 1.2 and less than 3.0.0 or is
 | |
| greater than or equal to 4.2.3.
 | |
| 
 | |
| The basic comparisons are:
 | |
| 
 | |
|     * `=`: equal (aliased to no operator)
 | |
|     * `!=`: not equal
 | |
|     * `>`: greater than
 | |
|     * `<`: less than
 | |
|     * `>=`: greater than or equal to
 | |
|     * `<=`: less than or equal to
 | |
| 
 | |
| Hyphen Range Comparisons
 | |
| 
 | |
| There are multiple methods to handle ranges and the first is hyphens ranges.
 | |
| These look like:
 | |
| 
 | |
|     * `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5`
 | |
|     * `2.3.4 - 4.5` which is equivalent to `>= 2.3.4, <= 4.5`
 | |
| 
 | |
| Wildcards In Comparisons
 | |
| 
 | |
| The `x`, `X`, and `*` characters can be used as a wildcard character. This works
 | |
| for all comparison operators. When used on the `=` operator it falls
 | |
| back to the pack level comparison (see tilde below). For example,
 | |
| 
 | |
|     * `1.2.x` is equivalent to `>= 1.2.0, < 1.3.0`
 | |
|     * `>= 1.2.x` is equivalent to `>= 1.2.0`
 | |
|     * `<= 2.x` is equivalent to `<= 3`
 | |
|     * `*` is equivalent to `>= 0.0.0`
 | |
| 
 | |
| Tilde Range Comparisons (Patch)
 | |
| 
 | |
| The tilde (`~`) comparison operator is for patch level ranges when a minor
 | |
| version is specified and major level changes when the minor number is missing.
 | |
| For example,
 | |
| 
 | |
|     * `~1.2.3` is equivalent to `>= 1.2.3, < 1.3.0`
 | |
|     * `~1` is equivalent to `>= 1, < 2`
 | |
|     * `~2.3` is equivalent to `>= 2.3, < 2.4`
 | |
|     * `~1.2.x` is equivalent to `>= 1.2.0, < 1.3.0`
 | |
|     * `~1.x` is equivalent to `>= 1, < 2`
 | |
| 
 | |
| Caret Range Comparisons (Major)
 | |
| 
 | |
| The caret (`^`) comparison operator is for major level changes. This is useful
 | |
| when comparisons of API versions as a major change is API breaking. For example,
 | |
| 
 | |
|     * `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0`
 | |
|     * `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0`
 | |
|     * `^2.3` is equivalent to `>= 2.3, < 3`
 | |
|     * `^2.x` is equivalent to `>= 2.0.0, < 3`
 | |
| */
 | |
| package semver
 |