12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- /* Copyright 2018 The Bazel Authors. All rights reserved.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package version
- import (
- "fmt"
- "strconv"
- "strings"
- )
- // Version is a tuple of non-negative integers that represents the version of
- // a software package.
- type Version []int
- func (v Version) String() string {
- cstrs := make([]string, len(v))
- for i, cn := range v {
- cstrs[i] = strconv.Itoa(cn)
- }
- return strings.Join(cstrs, ".")
- }
- // Compare returns an integer comparing two versions lexicographically.
- func (x Version) Compare(y Version) int {
- n := len(x)
- if len(y) < n {
- n = len(y)
- }
- for i := 0; i < n; i++ {
- cmp := x[i] - y[i]
- if cmp != 0 {
- return cmp
- }
- }
- return len(x) - len(y)
- }
- // ParseVersion parses a version of the form "12.34.56-abcd". Non-negative
- // integer components are separated by dots. An arbitrary suffix may appear
- // after '-', which is ignored.
- func ParseVersion(vs string) (Version, error) {
- i := strings.IndexByte(vs, '-')
- if i >= 0 {
- vs = vs[:i]
- }
- cstrs := strings.Split(vs, ".")
- v := make(Version, len(cstrs))
- for i, cstr := range cstrs {
- cn, err := strconv.Atoi(cstr)
- if err != nil {
- return nil, fmt.Errorf("could not parse version string: %q is not an integer", cstr)
- }
- if cn < 0 {
- return nil, fmt.Errorf("could not parse version string: %q is negative", cstr)
- }
- v[i] = cn
- }
- return v, nil
- }
|