@@ -281,6 +281,10 @@ func (l *Layout) CleanUp(ctx context.Context) (int, int64, error) {
281281
282282 // walk through remaining artifacts and collect digests
283283 if err := l .OCI .Walk (func (reference string , desc ocispec.Descriptor ) error {
284+ if desc .Digest .Validate () != nil {
285+ return nil
286+ }
287+
284288 // mark digest as referenced by existing artifact
285289 referencedDigests [desc .Digest .Hex ()] = true
286290
@@ -291,32 +295,37 @@ func (l *Layout) CleanUp(ctx context.Context) (int, int64, error) {
291295 }
292296 defer rc .Close ()
293297
294- var head struct {
295- MediaType string `json:"mediaType"`
298+ var manifest struct {
299+ Config struct {
300+ Digest digest.Digest `json:"digest"`
301+ }
302+ Layers []struct {
303+ digest.Digest `json:"digest"`
304+ } `json:"layers"`
305+ Manifests []struct {
306+ Digest digest.Digest `json:"digest"`
307+ } `json:"manifests"`
296308 }
297309
298- if err := json .NewDecoder (rc ).Decode (& head ); err != nil {
310+ if err := json .NewDecoder (rc ).Decode (& manifest ); err != nil {
299311 return nil
300312 }
301- if seeker , ok := rc .(io.Seeker ); ok {
302- _ , _ = seeker .Seek (0 , io .SeekStart )
313+
314+ // handle image manifest
315+ if manifest .Config .Digest .Validate () == nil {
316+ referencedDigests [manifest .Config .Digest .Hex ()] = true
303317 }
304318
305- switch head .MediaType {
306- case ocispec .MediaTypeImageIndex :
307- var index ocispec.Index
308- if err := json .NewDecoder (rc ).Decode (& index ); err == nil {
309- for _ , m := range index .Manifests {
310- referencedDigests [m .Digest .Hex ()] = true
311- }
319+ for _ , layer := range manifest .Layers {
320+ if layer .Digest .Validate () == nil {
321+ referencedDigests [layer .Digest .Hex ()] = true
312322 }
313- default :
314- var manifest ocispec.Manifest
315- if err := json .NewDecoder (rc ).Decode (& manifest ); err == nil {
316- referencedDigests [manifest .Config .Digest .Hex ()] = true
317- for _ , layer := range manifest .Layers {
318- referencedDigests [layer .Digest .Hex ()] = true
319- }
323+ }
324+
325+ // handle index list (manifests array)
326+ for _ , m := range manifest .Manifests {
327+ if m .Digest .Validate () == nil {
328+ referencedDigests [m .Digest .Hex ()] = true
320329 }
321330 }
322331
0 commit comments