Skip to content

Commit b2db5a3

Browse files
authored
fix(internal/semver): internalize Version and Parse (#3185)
1 parent 8a02f8a commit b2db5a3

File tree

2 files changed

+46
-46
lines changed

2 files changed

+46
-46
lines changed

internal/semver/semver.go

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import (
2525
"golang.org/x/mod/semver"
2626
)
2727

28-
// Version represents a semantic version.
29-
type Version struct {
28+
// version represents a semantic version.
29+
type version struct {
3030
Major, Minor, Patch int
3131
// Prerelease is the non-numeric part of the prerelease string (e.g., "alpha", "beta").
3232
Prerelease string
@@ -47,20 +47,20 @@ type Version struct {
4747
// prerelease - https://semver.org/spec/v1.0.0.html#spec-item-4.
4848
var semverV1PrereleaseNumberRegexp = regexp.MustCompile(`^(.*?)(\d+)$`)
4949

50-
// Parse deconstructs the SemVer 1.0.0 or 2.0.0 version string into a Version
50+
// parse deconstructs the SemVer 1.0.0 or 2.0.0 version string into a [version]
5151
// struct.
52-
func Parse(versionString string) (Version, error) {
52+
func parse(versionString string) (version, error) {
5353
// Our client versions must not have a "v" prefix.
5454
if strings.HasPrefix(versionString, "v") {
55-
return Version{}, fmt.Errorf("invalid version format: %s", versionString)
55+
return version{}, fmt.Errorf("invalid version format: %s", versionString)
5656
}
5757

5858
// Prepend "v" internally so that we can use various [semver] APIs.
5959
// Then canonicalize it to zero-fill any missing version segments.
6060
// Strips build metadata if present - we do not use build metadata suffixes.
6161
vPrefixedVersion := "v" + versionString
6262
if !semver.IsValid(vPrefixedVersion) {
63-
return Version{}, fmt.Errorf("invalid version format: %s", versionString)
63+
return version{}, fmt.Errorf("invalid version format: %s", versionString)
6464
}
6565
vPrefixedVersion = semver.Canonical(vPrefixedVersion)
6666

@@ -72,22 +72,22 @@ func Parse(versionString string) (Version, error) {
7272
versionCore = strings.TrimSuffix(versionCore, prerelease)
7373
vParts := strings.Split(versionCore, ".")
7474

75-
var v Version
75+
var v version
7676
var err error
7777

7878
v.Major, err = strconv.Atoi(vParts[0])
7979
if err != nil {
80-
return Version{}, fmt.Errorf("invalid major version: %w", err)
80+
return version{}, fmt.Errorf("invalid major version: %w", err)
8181
}
8282

8383
v.Minor, err = strconv.Atoi(vParts[1])
8484
if err != nil {
85-
return Version{}, fmt.Errorf("invalid minor version: %w", err)
85+
return version{}, fmt.Errorf("invalid minor version: %w", err)
8686
}
8787

8888
v.Patch, err = strconv.Atoi(vParts[2])
8989
if err != nil {
90-
return Version{}, fmt.Errorf("invalid patch version: %w", err)
90+
return version{}, fmt.Errorf("invalid patch version: %w", err)
9191
}
9292

9393
if prerelease == "" {
@@ -110,24 +110,24 @@ func Parse(versionString string) (Version, error) {
110110
if numStr != "" {
111111
num, err := strconv.Atoi(numStr)
112112
if err != nil {
113-
return Version{}, fmt.Errorf("invalid prerelease number: %w", err)
113+
return version{}, fmt.Errorf("invalid prerelease number: %w", err)
114114
}
115115
v.PrereleaseNumber = &num
116116
}
117117

118118
return v, nil
119119
}
120120

121-
// String formats a Version struct into a string.
122-
func (v Version) String() string {
123-
version := fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch)
121+
// String formats a [version] struct into a string.
122+
func (v version) String() string {
123+
vStr := fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch)
124124
if v.Prerelease != "" {
125-
version += "-" + v.Prerelease
125+
vStr += "-" + v.Prerelease
126126
if v.PrereleaseNumber != nil {
127-
version += v.PrereleaseSeparator + strconv.Itoa(*v.PrereleaseNumber)
127+
vStr += v.PrereleaseSeparator + strconv.Itoa(*v.PrereleaseNumber)
128128
}
129129
}
130-
return version
130+
return vStr
131131
}
132132

133133
// MaxVersion returns the largest semantic version string among the provided version strings.
@@ -198,50 +198,50 @@ func (o DeriveNextOptions) DeriveNext(highestChange ChangeLevel, currentVersion
198198
return currentVersion, nil
199199
}
200200

201-
version, err := Parse(currentVersion)
201+
v, err := parse(currentVersion)
202202
if err != nil {
203203
return "", fmt.Errorf("failed to parse current version: %w", err)
204204
}
205205

206206
// Only bump the prerelease version number.
207-
if version.Prerelease != "" && !o.BumpVersionCore {
207+
if v.Prerelease != "" && !o.BumpVersionCore {
208208
// Append prerelease number if there isn't one.
209-
if version.PrereleaseNumber == nil {
210-
version.PrereleaseSeparator = "."
209+
if v.PrereleaseNumber == nil {
210+
v.PrereleaseSeparator = "."
211211

212212
// Initialize a new int pointer set to 0. Fallthrough to increment
213213
// to 1. We prefer the first prerelease to use 1 instead of 0.
214-
version.PrereleaseNumber = new(int)
214+
v.PrereleaseNumber = new(int)
215215
}
216216

217-
*version.PrereleaseNumber++
218-
return version.String(), nil
217+
*v.PrereleaseNumber++
218+
return v.String(), nil
219219
}
220220

221221
// Reset prerelease number, if present, then fallthrough to bump version core.
222-
if version.PrereleaseNumber != nil && o.BumpVersionCore {
223-
*version.PrereleaseNumber = 1
222+
if v.PrereleaseNumber != nil && o.BumpVersionCore {
223+
*v.PrereleaseNumber = 1
224224
}
225225

226226
// Breaking changes result in a minor bump for pre-1.0.0 versions.
227-
if highestChange == Major && version.Major == 0 {
227+
if highestChange == Major && v.Major == 0 {
228228
highestChange = Minor
229229
}
230230

231231
// Bump the version core.
232232
switch highestChange {
233233
case Major:
234-
version.Major++
235-
version.Minor = 0
236-
version.Patch = 0
234+
v.Major++
235+
v.Minor = 0
236+
v.Patch = 0
237237
case Minor:
238-
version.Minor++
239-
version.Patch = 0
238+
v.Minor++
239+
v.Patch = 0
240240
case Patch:
241-
version.Patch++
241+
v.Patch++
242242
}
243243

244-
return version.String(), nil
244+
return v.String(), nil
245245
}
246246

247247
// DeriveNext calculates the next version based on the highest change type and

internal/semver/semver_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ func TestParse(t *testing.T) {
2929
for _, test := range []struct {
3030
name string
3131
version string
32-
want Version
32+
want version
3333
wantErr bool
3434
wantErrPhrase string
3535
}{
3636
{
3737
name: "valid version",
3838
version: "1.2.3",
39-
want: Version{
39+
want: version{
4040
Major: 1,
4141
Minor: 2,
4242
Patch: 3,
@@ -51,7 +51,7 @@ func TestParse(t *testing.T) {
5151
{
5252
name: "valid version with prerelease",
5353
version: "1.2.3-alpha.1",
54-
want: Version{
54+
want: version{
5555
Major: 1,
5656
Minor: 2,
5757
Patch: 3,
@@ -63,7 +63,7 @@ func TestParse(t *testing.T) {
6363
{
6464
name: "valid version with format 1.2.3-betaXX",
6565
version: "1.2.3-beta21",
66-
want: Version{
66+
want: version{
6767
Major: 1,
6868
Minor: 2,
6969
Patch: 3,
@@ -74,7 +74,7 @@ func TestParse(t *testing.T) {
7474
{
7575
name: "valid version with prerelease without version",
7676
version: "1.2.3-beta",
77-
want: Version{
77+
want: version{
7878
Major: 1,
7979
Minor: 2,
8080
Patch: 3,
@@ -84,7 +84,7 @@ func TestParse(t *testing.T) {
8484
{
8585
name: "valid shortened version",
8686
version: "1.2",
87-
want: Version{
87+
want: version{
8888
Major: 1,
8989
Minor: 2,
9090
Patch: 0,
@@ -98,7 +98,7 @@ func TestParse(t *testing.T) {
9898
},
9999
} {
100100
t.Run(test.name, func(t *testing.T) {
101-
actual, err := Parse(test.version)
101+
actual, err := parse(test.version)
102102
if test.wantErr {
103103
if err == nil {
104104
t.Fatal("Parse() should have failed")
@@ -121,12 +121,12 @@ func TestParse(t *testing.T) {
121121
func TestVersion_String(t *testing.T) {
122122
for _, test := range []struct {
123123
name string
124-
version Version
124+
version version
125125
expected string
126126
}{
127127
{
128128
name: "simple version",
129-
version: Version{
129+
version: version{
130130
Major: 1,
131131
Minor: 2,
132132
Patch: 3,
@@ -135,7 +135,7 @@ func TestVersion_String(t *testing.T) {
135135
},
136136
{
137137
name: "with prerelease",
138-
version: Version{
138+
version: version{
139139
Major: 1,
140140
Minor: 2,
141141
Patch: 3,
@@ -147,7 +147,7 @@ func TestVersion_String(t *testing.T) {
147147
},
148148
{
149149
name: "with prerelease no separator",
150-
version: Version{
150+
version: version{
151151
Major: 1,
152152
Minor: 2,
153153
Patch: 3,
@@ -158,7 +158,7 @@ func TestVersion_String(t *testing.T) {
158158
},
159159
{
160160
name: "with prerelease no version",
161-
version: Version{
161+
version: version{
162162
Major: 1,
163163
Minor: 2,
164164
Patch: 3,

0 commit comments

Comments
 (0)