github.com/YousefHaggyHeroku/pack@v1.5.5/internal/fakes/fake_package.go (about) 1 package fakes 2 3 import ( 4 "errors" 5 "io" 6 "os" 7 8 "github.com/google/go-containerregistry/pkg/v1/tarball" 9 10 "github.com/YousefHaggyHeroku/pack/internal/dist" 11 ) 12 13 type Package interface { 14 Name() string 15 BuildpackLayers() dist.BuildpackLayers 16 GetLayer(diffID string) (io.ReadCloser, error) 17 } 18 19 var _ Package = (*fakePackage)(nil) 20 21 type fakePackage struct { 22 name string 23 bpTarFiles map[string]string 24 bpLayers dist.BuildpackLayers 25 } 26 27 func NewPackage(tmpDir string, name string, buildpacks []dist.Buildpack) (Package, error) { 28 processBuildpack := func(bp dist.Buildpack) (tarFile string, diffID string, err error) { 29 tarFile, err = dist.BuildpackToLayerTar(tmpDir, bp) 30 if err != nil { 31 return "", "", err 32 } 33 34 layer, err := tarball.LayerFromFile(tarFile) 35 if err != nil { 36 return "", "", err 37 } 38 39 hash, err := layer.DiffID() 40 if err != nil { 41 return "", "", err 42 } 43 44 return tarFile, hash.String(), nil 45 } 46 47 bpLayers := dist.BuildpackLayers{} 48 bpTarFiles := map[string]string{} 49 for _, bp := range buildpacks { 50 tarFile, diffID, err := processBuildpack(bp) 51 if err != nil { 52 return nil, err 53 } 54 bpTarFiles[diffID] = tarFile 55 dist.AddBuildpackToLayersMD(bpLayers, bp.Descriptor(), diffID) 56 } 57 58 return &fakePackage{ 59 name: name, 60 bpTarFiles: bpTarFiles, 61 bpLayers: bpLayers, 62 }, nil 63 } 64 65 func (f *fakePackage) Name() string { 66 return f.name 67 } 68 69 func (f *fakePackage) BuildpackLayers() dist.BuildpackLayers { 70 return f.bpLayers 71 } 72 73 func (f *fakePackage) GetLayer(diffID string) (io.ReadCloser, error) { 74 tarFile, ok := f.bpTarFiles[diffID] 75 if !ok { 76 return nil, errors.New("no layer found") 77 } 78 79 return os.Open(tarFile) 80 }