blob: 999854e0133cc67711dcd3fb236f431a70b5bd54 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Serge Bazanski8999faa2023-11-20 12:42:13 +01004// Package version is a companion library to the //version/spec proto.
5package version
6
7import (
8 "fmt"
9 "strings"
10
11 "source.monogon.dev/version/spec"
12)
13
14// Release converts a spec.Version's Release field into a SemVer 2.0.0 compatible
15// string in the X.Y.Z form.
Jan Schärd20ddcc2024-05-08 14:18:29 +020016func Release(rel *spec.Version_Release) string {
17 if rel == nil {
Serge Bazanski8999faa2023-11-20 12:42:13 +010018 return "0.0.0"
19 }
Serge Bazanski8999faa2023-11-20 12:42:13 +010020 return fmt.Sprintf("%d.%d.%d", rel.Major, rel.Minor, rel.Patch)
21}
22
23// Semver converts a spec.Version proto message into a SemVer 2.0.0 compatible
24// string.
25func Semver(v *spec.Version) string {
Jan Schärd20ddcc2024-05-08 14:18:29 +020026 ver := "v" + Release(v.Release)
Serge Bazanski8999faa2023-11-20 12:42:13 +010027 var prerelease []string
28 if git := v.GitInformation; git != nil {
29 if n := git.CommitsSinceRelease; n != 0 {
30 prerelease = append(prerelease, fmt.Sprintf("dev%d", n))
31 }
32 prerelease = append(prerelease, fmt.Sprintf("g%s", git.CommitHash[:8]))
33 if git.BuildTreeState != spec.Version_GitInformation_BUILD_TREE_STATE_CLEAN {
34 prerelease = append(prerelease, "dirty")
35 }
36 }
37
38 if len(prerelease) > 0 {
39 ver += "-" + strings.Join(prerelease, ".")
40 }
41 return ver
42}
Jan Schärd20ddcc2024-05-08 14:18:29 +020043
44// ReleaseLessThan returns true if Release a is lexicographically smaller than b.
45func ReleaseLessThan(a, b *spec.Version_Release) bool {
46 if a.Major != b.Major {
47 return a.Major < b.Major
48 }
49 if a.Minor != b.Minor {
50 return a.Minor < b.Minor
51 }
52 if a.Patch != b.Patch {
53 return a.Patch < b.Patch
54 }
55 return false
56}