blob: 668e0fa61dd8523c62d581f45555ec405d69f55e [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.
Jan Schärd20ddcc2024-05-08 14:18:29 +020013func Release(rel *spec.Version_Release) string {
14 if rel == nil {
Serge Bazanski8999faa2023-11-20 12:42:13 +010015 return "0.0.0"
16 }
Serge Bazanski8999faa2023-11-20 12:42:13 +010017 return fmt.Sprintf("%d.%d.%d", rel.Major, rel.Minor, rel.Patch)
18}
19
20// Semver converts a spec.Version proto message into a SemVer 2.0.0 compatible
21// string.
22func Semver(v *spec.Version) string {
Jan Schärd20ddcc2024-05-08 14:18:29 +020023 ver := "v" + Release(v.Release)
Serge Bazanski8999faa2023-11-20 12:42:13 +010024 var prerelease []string
25 if git := v.GitInformation; git != nil {
26 if n := git.CommitsSinceRelease; n != 0 {
27 prerelease = append(prerelease, fmt.Sprintf("dev%d", n))
28 }
29 prerelease = append(prerelease, fmt.Sprintf("g%s", git.CommitHash[:8]))
30 if git.BuildTreeState != spec.Version_GitInformation_BUILD_TREE_STATE_CLEAN {
31 prerelease = append(prerelease, "dirty")
32 }
33 }
34
35 if len(prerelease) > 0 {
36 ver += "-" + strings.Join(prerelease, ".")
37 }
38 return ver
39}
Jan Schärd20ddcc2024-05-08 14:18:29 +020040
41// ReleaseLessThan returns true if Release a is lexicographically smaller than b.
42func ReleaseLessThan(a, b *spec.Version_Release) bool {
43 if a.Major != b.Major {
44 return a.Major < b.Major
45 }
46 if a.Minor != b.Minor {
47 return a.Minor < b.Minor
48 }
49 if a.Patch != b.Patch {
50 return a.Patch < b.Patch
51 }
52 return false
53}