88 "github.com/operator-framework/operator-registry/alpha/declcfg"
99
1010 ocv1 "github.com/operator-framework/operator-controller/api/v1"
11+ "github.com/operator-framework/operator-controller/internal/operator-controller/bundleutil"
1112 "github.com/operator-framework/operator-controller/internal/shared/util/filter"
1213)
1314
@@ -17,11 +18,15 @@ import (
1718func parseInstalledBundleVersionRelease (installedBundle ocv1.BundleMetadata ) (* declcfg.VersionRelease , error ) {
1819 // Handle legacy registry+v1 format: release embedded in version's build metadata
1920 if installedBundle .Release == nil {
20- return newLegacyRegistryV1VersionRelease (installedBundle .Version )
21+ vr , err := bundleutil .ParseLegacyVersionRelease (installedBundle .Version )
22+ if err != nil {
23+ return nil , fmt .Errorf ("failed to get version and release of installed bundle: %w" , err )
24+ }
25+ return vr , nil
2126 }
2227
2328 // Bundle has explicit release field (or explicitly empty) - parse version and release from separate fields.
24- // Note: We can't use newLegacyRegistryV1VersionRelease here because the version might
29+ // Note: We can't use ParseLegacyVersionRelease here because the version might
2530 // already contain build metadata (e.g., "1.0.0+git.abc"), which serves its proper
2631 // semver purpose when using explicit pkg.Release. Concatenating would create invalid
2732 // semver like "1.0.0+git.abc+2".
@@ -48,35 +53,6 @@ func parseInstalledBundleVersionRelease(installedBundle ocv1.BundleMetadata) (*d
4853 }, nil
4954}
5055
51- // newLegacyRegistryV1VersionRelease parses a registry+v1 bundle version string and returns a
52- // VersionRelease. Some registry+v1 bundles utilize the build metadata field of the semver version
53- // as release information (a semver spec violation maintained for backward compatibility).
54- func newLegacyRegistryV1VersionRelease (vStr string ) (* declcfg.VersionRelease , error ) {
55- vers , err := bsemver .Parse (vStr )
56- if err != nil {
57- return nil , fmt .Errorf ("failed to get version and release of installed bundle: %w" , err )
58- }
59-
60- vr := & declcfg.VersionRelease {
61- Version : vers ,
62- }
63-
64- buildMetadata := ""
65- if len (vr .Version .Build ) > 0 {
66- buildMetadata = vr .Version .Build [0 ]
67- for i := 1 ; i < len (vr .Version .Build ); i ++ {
68- buildMetadata += "." + vr .Version .Build [i ]
69- }
70- }
71-
72- rel , err := declcfg .NewRelease (buildMetadata )
73- if err == nil && len (rel ) > 0 {
74- vr .Release = rel
75- vr .Version .Build = nil
76- }
77- return vr , nil
78- }
79-
8056func SuccessorsOf (installedBundle ocv1.BundleMetadata , channels ... declcfg.Channel ) (filter.Predicate [declcfg.Bundle ], error ) {
8157 installedVersionRelease , err := parseInstalledBundleVersionRelease (installedBundle )
8258 if err != nil {
0 commit comments