cluster/utils/version.go (73 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 utils import ( "fmt" "regexp" "strconv" "strings" ) type Version []int var ( parseVersionRe = regexp.MustCompile(`^[Vv](\d+(\.\d+)*)$`) V3_1, _ = ParseVersion("v3.1") ) func ParseVersion(versionStr string) (Version, error) { if versionContainsIllegalCharacters(versionStr) { return nil, fmt.Errorf("illegal version string: %s , parse fail ", versionStr) } matches := parseVersionRe.FindStringSubmatch(versionStr) if matches == nil { return nil, fmt.Errorf("invalid version string format") } versionParts := strings.Split(matches[1], ".") version := make([]int, len(versionParts)) for i, part := range versionParts { number, err := strconv.Atoi(part) if err != nil { return nil, fmt.Errorf("invalid version number part: %s", part) } version[i] = number } return version, nil } const ( versionEqual = 0 versionLess = -1 versionGreater = 1 ) func (v Version) Equal(target Version) bool { return v.compareVersions(target) == versionEqual } func (v Version) Less(target Version) bool { return v.compareVersions(target) == versionLess } func (v Version) Greater(target Version) bool { return v.compareVersions(target) == versionGreater } func (v Version) compareVersions(target Version) int { for i := 0; i < len(v) || i < len(target); i++ { v1 := 0 if i < len(v) { v1 = v[i] } v2 := 0 if i < len(target) { v2 = target[i] } if v1 > v2 { return versionGreater } else if v1 < v2 { return versionLess } } if len(v) > len(target) { return versionGreater } else if len(v) < len(target) { return versionLess } else { return versionEqual } } var versionContainsIllegalCharactersRe = regexp.MustCompile(`^[Vv0-9.]+$`) func versionContainsIllegalCharacters(s string) bool { return !versionContainsIllegalCharactersRe.MatchString(s) }