Skip to content

Commit 06f6655

Browse files
committed
refactor(oci_reference): support build metadata
Add support for reading/writing semver tags with build metadata to OCIReference. Signed-off-by: Erik Cederberg <erik.cederberg@sectra.com>
1 parent 2efbc4d commit 06f6655

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

pkg/cnab/oci_reference.go

+12-3
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ func (r OCIReference) HasVersion() bool {
163163
}
164164

165165
if tagged, ok := r.Named.(reference.Tagged); ok {
166-
_, err := semver.NewVersion(tagged.Tag())
166+
_, err := semverFromTag(tagged.Tag())
167167
return err == nil
168168
}
169169
return false
@@ -176,7 +176,7 @@ func (r OCIReference) Version() string {
176176
}
177177

178178
if tagged, ok := r.Named.(reference.Tagged); ok {
179-
v, err := semver.NewVersion(tagged.Tag())
179+
v, err := semverFromTag(tagged.Tag())
180180
if err == nil {
181181
return v.String()
182182
}
@@ -185,6 +185,7 @@ func (r OCIReference) Version() string {
185185
}
186186

187187
// WithVersion creates a new reference using the repository and the specified bundle version.
188+
// If build metadata is present, "+" is conveted to "_".
188189
func (r OCIReference) WithVersion(version string) (OCIReference, error) {
189190
if r.Named == nil {
190191
return OCIReference{}, errors.New("OCIReference has not been initialized")
@@ -195,7 +196,7 @@ func (r OCIReference) WithVersion(version string) (OCIReference, error) {
195196
return OCIReference{}, fmt.Errorf("invalid bundle version specified %s: %w", version, err)
196197
}
197198

198-
newRef, err := reference.WithTag(r.Named, "v"+v.String())
199+
newRef, err := reference.WithTag(r.Named, tagFromSemver(v))
199200
if err != nil {
200201
return OCIReference{}, err
201202
}
@@ -233,3 +234,11 @@ func (r OCIReference) ParseRepositoryInfo() (*registry.RepositoryInfo, error) {
233234
}
234235
return registry.ParseRepositoryInfo(r.Named)
235236
}
237+
238+
func semverFromTag(tag string) (*semver.Version, error) {
239+
return semver.NewVersion(strings.Replace(tag, "_", "+", 1))
240+
}
241+
242+
func tagFromSemver(version *semver.Version) string {
243+
return fmt.Sprintf("v%s", strings.Replace(version.String(), "+", "_", 1))
244+
}

pkg/cnab/oci_reference_test.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ func TestOCIReference(t *testing.T) {
3737
},
3838
{
3939
Name: "tagged reference",
40-
Ref: MustParseOCIReference("jeremyrickard/porter-do-bundle:v0.1.0"),
40+
Ref: MustParseOCIReference("jeremyrickard/porter-do-bundle:v0.1.0-pre_build.123"),
4141
ExpectedRegistry: "docker.io",
4242
ExpectedRepo: "jeremyrickard/porter-do-bundle",
43-
ExpectedTag: "v0.1.0",
44-
ExpectedVersion: "0.1.0",
43+
ExpectedTag: "v0.1.0-pre_build.123",
44+
ExpectedVersion: "0.1.0-pre+build.123",
4545
},
4646
{
4747
Name: "no tag",
@@ -131,6 +131,14 @@ func TestOCIReference_WithVersion(t *testing.T) {
131131
assert.Equal(t, "v1.2.3", result.Tag())
132132
})
133133

134+
t.Run("semver with build metadata", func(t *testing.T) {
135+
ref := MustParseOCIReference("getporter/porter-hello")
136+
137+
result, err := ref.WithVersion("1.2.3+git0a2b3c4d")
138+
require.NoError(t, err)
139+
assert.Equal(t, "v1.2.3_git0a2b3c4d", result.Tag())
140+
})
141+
134142
t.Run("invalid semver", func(t *testing.T) {
135143
ref := MustParseOCIReference("getporter/porter-hello")
136144

0 commit comments

Comments
 (0)