@@ -482,13 +482,11 @@ func ProcessManifestList(ctx context.Context, srcDigest digest.Digest, srcManife
482482// ManifestsFromList returns a map of all image manifests for a given manifest. It returns the ManifestList and its digest if
483483// srcManifest is a list, or an error.
484484func ManifestsFromList (ctx context.Context , srcDigest digest.Digest , srcManifest distribution.Manifest , manifests distribution.ManifestService , ref imagereference.DockerImageReference ) (map [digest.Digest ]distribution.Manifest , * manifestlist.DeserializedManifestList , digest.Digest , error ) {
485- switch t := srcManifest .(type ) {
486- case * manifestlist.DeserializedManifestList :
485+ processManifestList := func (manifestList * manifestlist.DeserializedManifestList ) (map [digest.Digest ]distribution.Manifest , * manifestlist.DeserializedManifestList , digest.Digest , error ) {
487486 allManifests := make (map [digest.Digest ]distribution.Manifest )
488487 manifestDigest := srcDigest
489- manifestList := t
490488
491- for i , manifest := range t .Manifests {
489+ for i , manifest := range manifestList .Manifests {
492490 childManifest , err := manifests .Get (ctx , manifest .Digest , PreferManifestList )
493491 if err != nil {
494492 return nil , nil , "" , fmt .Errorf ("unable to retrieve source image %s manifest #%d from manifest list: %v" , ref , i + 1 , err )
@@ -497,12 +495,45 @@ func ManifestsFromList(ctx context.Context, srcDigest digest.Digest, srcManifest
497495 }
498496
499497 return allManifests , manifestList , manifestDigest , nil
498+ }
499+ switch t := srcManifest .(type ) {
500+ case * manifestlist.DeserializedManifestList :
501+ return processManifestList (t )
502+
503+ case * ocischema.DeserializedImageIndex :
504+ manifestList , err := manifestListFromIndex (t )
505+ if err != nil {
506+ return nil , nil , "" , err
507+ }
508+
509+ return processManifestList (manifestList )
500510
501511 default :
502512 return map [digest.Digest ]distribution.Manifest {srcDigest : srcManifest }, nil , "" , nil
503513 }
504514}
505515
516+ func manifestListFromIndex (index * ocischema.DeserializedImageIndex ) (* manifestlist.DeserializedManifestList , error ) {
517+ descriptors := make ([]manifestlist.ManifestDescriptor , len (index .Manifests ))
518+ for i , m := range index .Manifests {
519+ descriptors [i ] = manifestlist.ManifestDescriptor {
520+ Descriptor : m ,
521+ Platform : manifestlist.PlatformSpec {
522+ Architecture : m .Platform .Architecture ,
523+ OS : m .Platform .OS ,
524+ OSVersion : m .Platform .OSVersion ,
525+ OSFeatures : m .Platform .OSFeatures ,
526+ Variant : m .Platform .Variant ,
527+ },
528+ }
529+ }
530+ list , err := manifestlist .FromDescriptors (descriptors )
531+ if err != nil {
532+ return nil , fmt .Errorf ("unable to convert manifest index into list: %w" , err )
533+ }
534+ return list , nil
535+ }
536+
506537// PutManifestInCompatibleSchema just calls ManifestService.Put right now.
507538// No schema conversion is happening anymore. Instead of using this function,
508539// call ManifestService.Put directly.
0 commit comments