@@ -19,11 +19,11 @@ import (
1919type Version struct {
2020 log * logrus.Entry
2121
22- client * client.Client
22+ client client.ClientHandler
2323 imageCache * cache.Cache
2424}
2525
26- func New (log * logrus.Entry , client * client.Client , cacheTimeout time.Duration ) * Version {
26+ func New (log * logrus.Entry , client client.ClientHandler , cacheTimeout time.Duration ) * Version {
2727 log = log .WithField ("module" , "version_getter" )
2828
2929 v := & Version {
@@ -49,7 +49,7 @@ func (v *Version) LatestTagFromImage(ctx context.Context, imageURL string, opts
4949
5050 // If UseSHA then return early
5151 if opts .UseSHA {
52- tag , err = latestSHA (tags )
52+ tag , err = latestSHA (opts , tags )
5353 if err != nil {
5454 return nil , err
5555 }
@@ -88,6 +88,7 @@ func (v *Version) Fetch(ctx context.Context, imageURL string, _ *api.Options) (i
8888 if len (tags ) == 0 {
8989 return nil , versionerrors .NewVersionErrorNotFound ("no tags found for given image URL: %q" , imageURL )
9090 }
91+ v .log .WithField ("image" , imageURL ).Debugf ("fetched %v tags" , len (tags ))
9192
9293 return tags , nil
9394}
@@ -102,13 +103,18 @@ func latestSemver(opts *api.Options, tags []api.ImageTag) (*api.ImageTag, error)
102103 )
103104
104105 for i := range tags {
106+ // Filter out SBOM and Attestation/Sig's
107+ if isSBOMAttestationOrSig (tags [i ].Tag ) || isSBOMAttestationOrSig (tags [i ].SHA ) {
108+ continue
109+ }
110+
105111 v := semver .Parse (tags [i ].Tag )
106112
107113 if shouldSkipTag (opts , v ) {
108114 continue
109115 }
110116
111- if isBetterTag (opts , latestV , v , latestImageTag , & tags [i ]) {
117+ if isBetterSemVer (opts , latestV , v , latestImageTag , & tags [i ]) {
112118 latestV = v
113119 latestImageTag = & tags [i ]
114120 }
@@ -121,43 +127,16 @@ func latestSemver(opts *api.Options, tags []api.ImageTag) (*api.ImageTag, error)
121127 return latestImageTag , nil
122128}
123129
124- func shouldSkipTag (opts * api.Options , v * semver.SemVer ) bool {
125- // Handle Regex matching
126- if opts .RegexMatcher != nil {
127- return ! opts .RegexMatcher .MatchString (v .String ())
128- }
129-
130- // Handle metadata and version pinning
131- return (! opts .UseMetaData && v .HasMetaData ()) ||
132- (opts .PinMajor != nil && * opts .PinMajor != v .Major ()) ||
133- (opts .PinMinor != nil && * opts .PinMinor != v .Minor ()) ||
134- (opts .PinPatch != nil && * opts .PinPatch != v .Patch ())
135- }
136-
137- func isBetterTag (_ * api.Options , latestV , v * semver.SemVer , latestImageTag , currentImageTag * api.ImageTag ) bool {
138- // No latest version set yet
139- if latestV == nil {
140- return true
141- }
142-
143- // If the current version is greater than the latest
144- if latestV .LessThan (v ) {
145- return true
146- }
147-
148- // If the versions are equal, prefer the one with a later timestamp
149- if latestV .Equal (v ) && currentImageTag .Timestamp .After (latestImageTag .Timestamp ) {
150- return true
151- }
152-
153- return false
154- }
155-
156130// latestSHA will return the latest ImageTag based on image timestamps.
157- func latestSHA (tags []api.ImageTag ) (* api.ImageTag , error ) {
131+ func latestSHA (opts * api. Options , tags []api.ImageTag ) (* api.ImageTag , error ) {
158132 var latestTag * api.ImageTag
159133
160134 for i := range tags {
135+ // Filter out SBOM and Attestation/Sig's...
136+ if shouldSkipSHA (opts , tags [i ].Tag ) {
137+ continue
138+ }
139+
161140 if latestTag == nil || tags [i ].Timestamp .After (latestTag .Timestamp ) {
162141 latestTag = & tags [i ]
163142 }
0 commit comments