dev-tools/mage/semver.go (38 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License 2.0;
// you may not use this file except in compliance with the Elastic License 2.0.
package mage
import (
"fmt"
"regexp"
"strconv"
)
// SemanticVersionRegex regex for semantic version
var SemanticVersionRegex = regexp.MustCompile(`(?m)^(\d+)\.(\d+)(?:\.(\d+))?`)
// SemanticVersion contains version details
type SemanticVersion struct {
Major, Minor, Patch int
}
// NewSemanticVersion return a new SemanticVersion parsed from string in the
// format of 'x.y' or 'x.y.z'.
func NewSemanticVersion(s string) (*SemanticVersion, error) {
matches := SemanticVersionRegex.FindStringSubmatch(s)
if len(matches) < 4 {
return nil, fmt.Errorf("invalid version format %q", s)
}
major, _ := strconv.Atoi(matches[1])
Minor, _ := strconv.Atoi(matches[2])
Patch, _ := strconv.Atoi(matches[3])
return &SemanticVersion{major, Minor, Patch}, nil
}
// LessThan return true iff s is less than x.
func (s *SemanticVersion) LessThan(x *SemanticVersion) bool {
if s.Major != x.Major {
return s.Major < x.Major
}
if s.Minor != x.Minor {
return s.Minor < x.Minor
}
return s.Patch < x.Patch
}
// LessThanOrEqual return true iff s is less than or equal to x.
func (s *SemanticVersion) LessThanOrEqual(x *SemanticVersion) bool {
if s.LessThan(x) {
return true
}
return !x.LessThan(s)
}
func (s SemanticVersion) String() string {
return fmt.Sprintf("%d.%d.%d", s.Major, s.Minor, s.Patch)
}