You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
runner-go/environ/calver.go

117 lines
2.5 KiB
Go

// Copyright 2019 Drone.IO Inc. All rights reserved.
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
package environ
import (
"bytes"
"strconv"
"strings"
)
func calversions(s string) map[string]string {
env := map[string]string{}
version := parseCalver(s)
if version == nil {
return nil
}
// we try to determine if the major and minor
// versions are valid years.
if !isYear(version.Major) {
return env
}
env["DRONE_CALVER"] = version.String()
env["DRONE_CALVER_MAJOR_MINOR"] = version.Major + "." + version.Minor
env["DRONE_CALVER_MAJOR"] = version.Major
env["DRONE_CALVER_MINOR"] = version.Minor
env["DRONE_CALVER_MICRO"] = version.Micro
if version.Modifier != "" {
env["DRONE_CALVER_MODIFIER"] = version.Modifier
}
version.Modifier = ""
env["DRONE_CALVER_SHORT"] = version.String()
return env
}
type calver struct {
Major string
Minor string
Micro string
Modifier string
}
// helper function that parses tags in the calendar version
// format. note this is not a robust parser implementation
// and mat fail to properly parse all strings.
func parseCalver(s string) *calver {
s = strings.TrimPrefix(s, "v")
p := strings.SplitN(s, ".", 3)
if len(p) < 2 {
return nil
}
c := new(calver)
c.Major = p[0]
c.Minor = p[1]
if len(p) > 2 {
c.Micro = p[2]
}
switch {
case strings.Contains(c.Micro, "-"):
p := strings.SplitN(c.Micro, "-", 2)
c.Micro = p[0]
c.Modifier = p[1]
}
// the major and minor segments must be numbers to
// conform to the calendar version spec.
if !isNumber(c.Major) ||
!isNumber(c.Minor) {
return nil
}
return c
}
// String returns the calendar version string.
func (c *calver) String() string {
var buf bytes.Buffer
buf.WriteString(c.Major)
buf.WriteString(".")
buf.WriteString(c.Minor)
if c.Micro != "" {
buf.WriteString(".")
buf.WriteString(c.Micro)
}
if c.Modifier != "" {
buf.WriteString("-")
buf.WriteString(c.Modifier)
}
return buf.String()
}
// helper function returns true if the string is a
// valid number.
func isNumber(s string) bool {
_, err := strconv.Atoi(s)
return err == nil
}
// helper function returns true if the string is a
// valid year. This assumes a minimum year of 2019
// for YYYY format and a minimum year of 19 for YY
// format.
//
// TODO(bradrydzewski) if people are still using this
// code in 2099 we need to adjust the minimum YY value.
func isYear(s string) bool {
i, _ := strconv.Atoi(s)
return (i > 18 && i < 100) || (i > 2018 && i < 9999)
}