blob: 05fe63050f6d509af82be16e95d5b66e9a44dbfc [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ärdf588d02025-04-23 15:17:11 +000026 ver := 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 }
Jan Schärbddad352025-04-23 14:55:26 +000036 } else {
37 prerelease = append(prerelease, "nostamp")
Serge Bazanski8999faa2023-11-20 12:42:13 +010038 }
39
40 if len(prerelease) > 0 {
41 ver += "-" + strings.Join(prerelease, ".")
42 }
43 return ver
44}
Jan Schärd20ddcc2024-05-08 14:18:29 +020045
46// ReleaseLessThan returns true if Release a is lexicographically smaller than b.
47func ReleaseLessThan(a, b *spec.Version_Release) bool {
48 if a.Major != b.Major {
49 return a.Major < b.Major
50 }
51 if a.Minor != b.Minor {
52 return a.Minor < b.Minor
53 }
54 if a.Patch != b.Patch {
55 return a.Patch < b.Patch
56 }
57 return false
58}