@@ -16,6 +16,7 @@ import (
1616
1717 "github.com/BurntSushi/toml"
1818 "github.com/buildpacks/imgutil"
19+ v1 "github.com/google/go-containerregistry/pkg/v1"
1920 "github.com/pkg/errors"
2021
2122 "github.com/buildpacks/pack/builder"
@@ -447,29 +448,57 @@ func (b *Builder) Save(logger logging.Logger, creatorMetadata CreatorMetadata) e
447448
448449func (b * Builder ) addModules (kind string , logger logging.Logger , tmpDir string , image imgutil.Image , additionalModules []buildpack.BuildModule , layers dist.ModuleLayers ) error {
449450 collectionToAdd := map [string ]toAdd {}
451+
452+ type modInfo struct {
453+ info dist.ModuleInfo
454+ layerTar string
455+ diffID v1.Hash
456+ err error
457+ }
458+
459+ lids := make ([]chan modInfo , len (additionalModules ))
460+ for i := range lids {
461+ lids [i ] = make (chan modInfo , 1 )
462+ }
463+
450464 for i , module := range additionalModules {
451- // create directory
452- modTmpDir := filepath .Join (tmpDir , fmt .Sprintf ("%s-%s" , kind , strconv .Itoa (i )))
453- if err := os .MkdirAll (modTmpDir , os .ModePerm ); err != nil {
454- return errors .Wrapf (err , "creating %s temp dir" , kind )
455- }
465+ go func (i int , module buildpack.BuildModule ) {
466+ // create directory
467+ modTmpDir := filepath .Join (tmpDir , fmt .Sprintf ("%s-%s" , kind , strconv .Itoa (i )))
468+ if err := os .MkdirAll (modTmpDir , os .ModePerm ); err != nil {
469+ lids [i ] <- modInfo {err : errors .Wrapf (err , "creating %s temp dir" , kind )}
470+ }
456471
457- // create tar file
458- layerTar , err := buildpack .ToLayerTar (modTmpDir , module )
459- if err != nil {
460- return err
461- }
472+ // create tar file
473+ layerTar , err := buildpack .ToLayerTar (modTmpDir , module )
474+ if err != nil {
475+ lids [ i ] <- modInfo { err : err }
476+ }
462477
463- // generate diff id
464- diffID , err := dist .LayerDiffID (layerTar )
465- info := module .Descriptor ().Info ()
466- if err != nil {
467- return errors .Wrapf (err ,
468- "getting content hashes for %s %s" ,
469- kind ,
470- style .Symbol (info .FullName ()),
471- )
478+ // generate diff id
479+ diffID , err := dist .LayerDiffID (layerTar )
480+ info := module .Descriptor ().Info ()
481+ if err != nil {
482+ lids [i ] <- modInfo {err : errors .Wrapf (err ,
483+ "getting content hashes for %s %s" ,
484+ kind ,
485+ style .Symbol (info .FullName ()),
486+ )}
487+ }
488+ lids [i ] <- modInfo {
489+ info : info ,
490+ layerTar : layerTar ,
491+ diffID : diffID ,
492+ }
493+ }(i , module )
494+ }
495+
496+ for i , module := range additionalModules {
497+ mi := <- lids [i ]
498+ if mi .err != nil {
499+ return mi .err
472500 }
501+ info , diffID , layerTar := mi .info , mi .diffID , mi .layerTar
473502
474503 // check against builder layers
475504 if existingInfo , ok := layers [info.ID ][info.Version ]; ok {
0 commit comments