blob: 29296848362cc92c88ac1287a1deb2656b2670b9 [file] [log] [blame]
// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0
// Package version is a companion library to the //version/spec proto.
package version
import (
"fmt"
"strings"
"source.monogon.dev/version/spec"
)
// Release converts a spec.Version's Release field into a SemVer 2.0.0 compatible
// string in the X.Y.Z form.
func Release(rel *spec.Version_Release) string {
if rel == nil {
return "0.0.0"
}
return fmt.Sprintf("%d.%d.%d", rel.Major, rel.Minor, rel.Patch)
}
// Semver converts a spec.Version proto message into a SemVer 2.0.0 compatible
// string.
func Semver(v *spec.Version) string {
ver := "v" + Release(v.Release)
var prerelease []string
if git := v.GitInformation; git != nil {
if n := git.CommitsSinceRelease; n != 0 {
prerelease = append(prerelease, fmt.Sprintf("dev%d", n))
}
prerelease = append(prerelease, fmt.Sprintf("g%s", git.CommitHash[:8]))
if git.BuildTreeState != spec.Version_GitInformation_BUILD_TREE_STATE_CLEAN {
prerelease = append(prerelease, "dirty")
}
} else {
prerelease = append(prerelease, "nostamp")
}
if len(prerelease) > 0 {
ver += "-" + strings.Join(prerelease, ".")
}
return ver
}
// ReleaseLessThan returns true if Release a is lexicographically smaller than b.
func ReleaseLessThan(a, b *spec.Version_Release) bool {
if a.Major != b.Major {
return a.Major < b.Major
}
if a.Minor != b.Minor {
return a.Minor < b.Minor
}
if a.Patch != b.Patch {
return a.Patch < b.Patch
}
return false
}