Skip to content

Commit 64f5075

Browse files
committed
convert to semver.Version, using only prerelease
Signed-off-by: grokspawn <[email protected]>
1 parent ee35ce5 commit 64f5075

File tree

6 files changed

+78
-25
lines changed

6 files changed

+78
-25
lines changed

alpha/declcfg/declcfg_to_model.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,18 @@ func ConvertToModel(cfg DeclarativeConfig) (model.Model, error) {
135135
return nil, fmt.Errorf("error parsing bundle %q version %q: %v", b.Name, rawVersion, err)
136136
}
137137

138+
// Parse release version from the package property.
139+
var relver semver.Version
140+
if props.Packages[0].Release != "" {
141+
relver, err = semver.Parse(fmt.Sprintf("0.0.0-%s", props.Packages[0].Release))
142+
if err != nil {
143+
return nil, fmt.Errorf("error parsing bundle %q release version %q: %v", b.Name, props.Packages[0].Release, err)
144+
}
145+
if relver.Major != 0 || relver.Minor != 0 || relver.Patch != 0 || len(relver.Build) != 0 {
146+
return nil, fmt.Errorf("bundle %q release version %q must only contain prerelease", b.Name, props.Packages[0].Release)
147+
}
148+
}
149+
138150
channelDefinedEntries[b.Package] = channelDefinedEntries[b.Package].Delete(b.Name)
139151
found := false
140152
for _, mch := range mpkg.Channels {
@@ -147,7 +159,7 @@ func ConvertToModel(cfg DeclarativeConfig) (model.Model, error) {
147159
mb.Objects = b.Objects
148160
mb.PropertiesP = props
149161
mb.Version = ver
150-
mb.Release = props.Packages[0].Release
162+
mb.Release = relver
151163
}
152164
}
153165
if !found {

alpha/declcfg/declcfg_to_model_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,51 @@ func TestConvertToModel(t *testing.T) {
442442
},
443443
},
444444
},
445+
{
446+
name: "Error/InvalidReleaseVersion",
447+
assertion: hasError(`error parsing bundle "foo.v0.1.0" release version "!!!": Invalid character(s) found in prerelease "!!!"`),
448+
cfg: DeclarativeConfig{
449+
Packages: []Package{newTestPackage("foo", "alpha", svgSmallCircle)},
450+
Channels: []Channel{newTestChannel("foo", "alpha", ChannelEntry{Name: testBundleName("foo", "0.1.0")})},
451+
Bundles: []Bundle{newTestBundle("foo", "0.1.0", func(b *Bundle) {
452+
b.Properties = []property.Property{
453+
property.MustBuildPackageRelease("foo", "0.1.0", "!!!"),
454+
}
455+
})},
456+
},
457+
},
458+
{
459+
name: "Error/InvalidBundleNormalizedName",
460+
assertion: hasError(`invalid index:
461+
└── invalid package "foo":
462+
└── invalid channel "alpha":
463+
└── invalid bundle "foo.v0.1.0-alpha.1.0.0":
464+
└── name "foo.v0.1.0-alpha.1.0.0" does not match normalized name "foo-v0.1.0-alpha.1.0.0"`),
465+
cfg: DeclarativeConfig{
466+
Packages: []Package{newTestPackage("foo", "alpha", svgSmallCircle)},
467+
Channels: []Channel{newTestChannel("foo", "alpha", ChannelEntry{Name: "foo.v0.1.0-alpha.1.0.0"})},
468+
Bundles: []Bundle{newTestBundle("foo", "0.1.0", func(b *Bundle) {
469+
b.Properties = []property.Property{
470+
property.MustBuildPackageRelease("foo", "0.1.0", "alpha.1.0.0"),
471+
}
472+
b.Name = "foo.v0.1.0-alpha.1.0.0"
473+
})},
474+
},
475+
},
476+
{
477+
name: "Success/ValidBundleReleaseVersion",
478+
assertion: require.NoError,
479+
cfg: DeclarativeConfig{
480+
Packages: []Package{newTestPackage("foo", "alpha", svgSmallCircle)},
481+
Channels: []Channel{newTestChannel("foo", "alpha", ChannelEntry{Name: "foo-v0.1.0-alpha.1.0.0"})},
482+
Bundles: []Bundle{newTestBundle("foo", "0.1.0", func(b *Bundle) {
483+
b.Properties = []property.Property{
484+
property.MustBuildPackageRelease("foo", "0.1.0", "alpha.1.0.0"),
485+
}
486+
b.Name = "foo-v0.1.0-alpha.1.0.0"
487+
})},
488+
},
489+
},
445490
}
446491

447492
for _, s := range specs {

alpha/model/model.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,16 @@ type Bundle struct {
328328
// These fields are used to compare bundles in a diff.
329329
PropertiesP *property.Properties
330330
Version semver.Version
331-
Release semver.PRVersion
331+
Release semver.Version
332332
}
333333

334334
func (b *Bundle) VersionString() string {
335-
relString := b.Release.String()
336-
if relString != "" {
335+
if len(b.Release.Pre) > 0 {
336+
pres := []string{}
337+
for _, pre := range b.Release.Pre {
338+
pres = append(pres, pre.String())
339+
}
340+
relString := strings.Join(pres, ".")
337341
return strings.Join([]string{b.Version.String(), relString}, "-")
338342
}
339343
return b.Version.String()
@@ -343,9 +347,8 @@ func (b *Bundle) normalizeName() string {
343347
// if the bundle has release versioning, then the name must include this in standard form:
344348
// <package-name>-v<version>-<release version>
345349
// if no release versioning exists, then just return the bundle name
346-
relString := b.Release.String()
347-
if relString != "" {
348-
return strings.Join([]string{b.Package.Name, "v" + b.Version.String(), b.Release.String()}, "-")
350+
if len(b.Release.Pre) > 0 {
351+
return strings.Join([]string{b.Package.Name, "v" + b.VersionString()}, "-")
349352
}
350353
return b.Name
351354
}

alpha/model/model_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/base64"
55
"encoding/json"
66
"errors"
7+
"fmt"
78
"testing"
89

910
"github.com/blang/semver/v4"
@@ -291,8 +292,8 @@ func TestValidators(t *testing.T) {
291292
Bundles: map[string]*Bundle{
292293
"anakin.v0.0.1": {Name: "anakin.v0.0.1", Version: semver.MustParse("0.0.1")},
293294
"anakin.v0.0.2": {Name: "anakin.v0.0.2", Version: semver.MustParse("0.0.1")},
294-
"anakin-v0.0.1-hotfix.0.0.1": {Name: "anakin.v0.0.1", Version: semver.MustParse("0.0.1"), Release: property.MustBuildPackageReleaseVersion("100"), Package: pkg},
295-
"anakin-v0.0.2-hotfix.0.0.1": {Name: "anakin.v0.0.2", Version: semver.MustParse("0.0.1"), Release: property.MustBuildPackageReleaseVersion("100"), Package: pkg},
295+
"anakin-v0.0.1-hotfix.0.0.1": {Name: "anakin.v0.0.1", Version: semver.MustParse("0.0.1"), Release: semver.MustParse(fmt.Sprintf("0.0.0-%s", "100")), Package: pkg},
296+
"anakin-v0.0.2-hotfix.0.0.1": {Name: "anakin.v0.0.2", Version: semver.MustParse("0.0.1"), Release: semver.MustParse(fmt.Sprintf("0.0.0-%s", "100")), Package: pkg},
296297
},
297298
},
298299
},
@@ -308,7 +309,7 @@ func TestValidators(t *testing.T) {
308309
Package: pkg,
309310
Name: "light",
310311
Bundles: map[string]*Bundle{
311-
"anakin.v0.0.1.alpha1": {Name: "anakin.v0.0.1.alpha1", Version: semver.MustParse("0.0.1"), Release: property.MustBuildPackageReleaseVersion("alpha1"), Package: pkg},
312+
"anakin.v0.0.1.alpha1": {Name: "anakin.v0.0.1.alpha1", Version: semver.MustParse("0.0.1"), Release: semver.MustParse(fmt.Sprintf("0.0.0-%s", "alpha1")), Package: pkg},
312313
},
313314
},
314315
},

alpha/property/property.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"fmt"
88
"reflect"
99

10-
"github.com/blang/semver/v4"
1110
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1211

1312
"github.com/operator-framework/api/pkg/operators/v1alpha1"
@@ -37,9 +36,9 @@ func (p Property) String() string {
3736
}
3837

3938
type Package struct {
40-
PackageName string `json:"packageName"`
41-
Version string `json:"version"`
42-
Release semver.PRVersion `json:"release,omitzero"`
39+
PackageName string `json:"packageName"`
40+
Version string `json:"version"`
41+
Release string `json:"release,omitzero"`
4342
}
4443

4544
// NOTICE: The Channel properties are for internal use only.
@@ -249,15 +248,8 @@ func jsonMarshal(p interface{}) ([]byte, error) {
249248
func MustBuildPackage(name, version string) Property {
250249
return MustBuild(&Package{PackageName: name, Version: version})
251250
}
252-
func MustBuildPackageReleaseVersion(relVersion string) semver.PRVersion {
253-
val, err := semver.NewPRVersion(relVersion)
254-
if err != nil {
255-
panic(err)
256-
}
257-
return val
258-
}
259251
func MustBuildPackageRelease(name, version, relVersion string) Property {
260-
return MustBuild(&Package{PackageName: name, Version: version, Release: MustBuildPackageReleaseVersion(relVersion)})
252+
return MustBuild(&Package{PackageName: name, Version: version, Release: relVersion})
261253
}
262254
func MustBuildPackageRequired(name, versionRange string) Property {
263255
return MustBuild(&PackageRequired{name, versionRange})

alpha/property/property_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,19 +212,19 @@ func TestBuild(t *testing.T) {
212212
},
213213
{
214214
name: "Success/Package-ReleaseVersionNumber",
215-
input: &Package{PackageName: "name", Version: "0.1.0", Release: MustBuildPackageReleaseVersion("1")},
215+
input: &Package{PackageName: "name", Version: "0.1.0", Release: "1"},
216216
assertion: require.NoError,
217217
expectedProperty: propPtr(MustBuildPackageRelease("name", "0.1.0", "1")),
218218
},
219219
{
220220
name: "Success/Package-ReleaseVersionAlpha",
221-
input: &Package{PackageName: "name", Version: "0.1.0", Release: MustBuildPackageReleaseVersion("gamma")},
221+
input: &Package{PackageName: "name", Version: "0.1.0", Release: "gamma"},
222222
assertion: require.NoError,
223223
expectedProperty: propPtr(MustBuildPackageRelease("name", "0.1.0", "gamma")),
224224
},
225225
{
226226
name: "Success/Package-ReleaseVersionMixed",
227-
input: &Package{PackageName: "name", Version: "0.1.0", Release: MustBuildPackageReleaseVersion("gamma1")},
227+
input: &Package{PackageName: "name", Version: "0.1.0", Release: "gamma1"},
228228
assertion: require.NoError,
229229
expectedProperty: propPtr(MustBuildPackageRelease("name", "0.1.0", "gamma1")),
230230
},

0 commit comments

Comments
 (0)