@@ -31,6 +31,7 @@ import (
3131 "github.com/opencontainers/image-spec/identity"
3232 ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
3333 "github.com/pkg/errors"
34+ "golang.org/x/sync/errgroup"
3435)
3536
3637const (
@@ -277,31 +278,32 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
277278 }
278279
279280 if ! e .storeAllowIncomplete {
281+ var refs []cache.ImmutableRef
280282 if src .Ref != nil {
281- remotes , err := src .Ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
282- if err != nil {
283- return nil , nil , err
284- }
285- remote := remotes [0 ]
286- if unlazier , ok := remote .Provider .(cache.Unlazier ); ok {
287- if err := unlazier .Unlazy (ctx ); err != nil {
288- return nil , nil , err
289- }
290- }
283+ refs = append (refs , src .Ref )
291284 }
292- if len (src .Refs ) > 0 {
293- for _ , r := range src .Refs {
294- remotes , err := r .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
285+ for _ , ref := range src .Refs {
286+ refs = append (refs , ref )
287+ }
288+ eg , ctx := errgroup .WithContext (ctx )
289+ for _ , ref := range refs {
290+ ref := ref
291+ eg .Go (func () error {
292+ remotes , err := ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
295293 if err != nil {
296- return nil , nil , err
294+ return err
297295 }
298296 remote := remotes [0 ]
299297 if unlazier , ok := remote .Provider .(cache.Unlazier ); ok {
300298 if err := unlazier .Unlazy (ctx ); err != nil {
301- return nil , nil , err
299+ return err
302300 }
303301 }
304- }
302+ return nil
303+ })
304+ }
305+ if err := eg .Wait (); err != nil {
306+ return nil , nil , err
305307 }
306308 }
307309 }
@@ -331,10 +333,18 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
331333}
332334
333335func (e * imageExporterInstance ) pushImage (ctx context.Context , src * exporter.Source , sessionID string , targetName string , dgst digest.Digest ) error {
336+ var refs []cache.ImmutableRef
337+ if src .Ref != nil {
338+ refs = append (refs , src .Ref )
339+ }
340+ for _ , ref := range src .Refs {
341+ refs = append (refs , ref )
342+ }
343+
334344 annotations := map [digest.Digest ]map [string ]string {}
335345 mprovider := contentutil .NewMultiProvider (e .opt .ImageWriter .ContentStore ())
336- if src . Ref != nil {
337- remotes , err := src . Ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
346+ for _ , ref := range refs {
347+ remotes , err := ref .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
338348 if err != nil {
339349 return err
340350 }
@@ -344,19 +354,6 @@ func (e *imageExporterInstance) pushImage(ctx context.Context, src *exporter.Sou
344354 addAnnotations (annotations , desc )
345355 }
346356 }
347- if len (src .Refs ) > 0 {
348- for _ , r := range src .Refs {
349- remotes , err := r .GetRemotes (ctx , false , e .opts .RefCfg , false , session .NewGroup (sessionID ))
350- if err != nil {
351- return err
352- }
353- remote := remotes [0 ]
354- for _ , desc := range remote .Descriptors {
355- mprovider .Add (desc .Digest , remote .Provider )
356- addAnnotations (annotations , desc )
357- }
358- }
359- }
360357 return push .Push (ctx , e .opt .SessionManager , sessionID , mprovider , e .opt .ImageWriter .ContentStore (), dgst , targetName , e .insecure , e .opt .RegistryHosts , e .pushByDigest , annotations )
361358}
362359
0 commit comments