blob: b4955284f9b000c2d7da5fc8267cb0991793b1dd [file] [log] [blame]
Serge Bazanski8999faa2023-11-20 12:42:13 +01001// Package version is a companion library to the //version/spec proto.
2package version
3
4import (
5 "fmt"
6 "strings"
7
8 "source.monogon.dev/version/spec"
9)
10
11// Release converts a spec.Version's Release field into a SemVer 2.0.0 compatible
12// string in the X.Y.Z form.
13func Release(v *spec.Version) string {
14 if v == nil || v.Release == nil {
15 return "0.0.0"
16 }
17 rel := v.Release
18 return fmt.Sprintf("%d.%d.%d", rel.Major, rel.Minor, rel.Patch)
19}
20
21// Semver converts a spec.Version proto message into a SemVer 2.0.0 compatible
22// string.
23func Semver(v *spec.Version) string {
24 ver := "v" + Release(v)
25 var prerelease []string
26 if git := v.GitInformation; git != nil {
27 if n := git.CommitsSinceRelease; n != 0 {
28 prerelease = append(prerelease, fmt.Sprintf("dev%d", n))
29 }
30 prerelease = append(prerelease, fmt.Sprintf("g%s", git.CommitHash[:8]))
31 if git.BuildTreeState != spec.Version_GitInformation_BUILD_TREE_STATE_CLEAN {
32 prerelease = append(prerelease, "dirty")
33 }
34 }
35
36 if len(prerelease) > 0 {
37 ver += "-" + strings.Join(prerelease, ".")
38 }
39 return ver
40}