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  }