github.com/YousefHaggyHeroku/pack@v1.5.5/internal/dist/layers.go (about) 1 package dist 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "path/filepath" 8 9 v1 "github.com/google/go-containerregistry/pkg/v1" 10 "github.com/google/go-containerregistry/pkg/v1/tarball" 11 "github.com/pkg/errors" 12 ) 13 14 func BuildpackToLayerTar(dest string, bp Buildpack) (string, error) { 15 bpd := bp.Descriptor() 16 bpReader, err := bp.Open() 17 if err != nil { 18 return "", errors.Wrap(err, "opening buildpack blob") 19 } 20 defer bpReader.Close() 21 22 layerTar := filepath.Join(dest, fmt.Sprintf("%s.%s.tar", bpd.EscapedID(), bpd.Info.Version)) 23 fh, err := os.Create(layerTar) 24 if err != nil { 25 return "", errors.Wrap(err, "create file for tar") 26 } 27 defer fh.Close() 28 29 if _, err := io.Copy(fh, bpReader); err != nil { 30 return "", errors.Wrap(err, "writing buildpack blob to tar") 31 } 32 33 return layerTar, nil 34 } 35 36 func LayerDiffID(layerTarPath string) (v1.Hash, error) { 37 fh, err := os.Open(layerTarPath) 38 if err != nil { 39 return v1.Hash{}, errors.Wrap(err, "opening tar file") 40 } 41 defer fh.Close() 42 43 layer, err := tarball.LayerFromFile(layerTarPath) 44 if err != nil { 45 return v1.Hash{}, errors.Wrap(err, "reading layer tar") 46 } 47 48 hash, err := layer.DiffID() 49 if err != nil { 50 return v1.Hash{}, errors.Wrap(err, "generating diff id") 51 } 52 53 return hash, nil 54 }