github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/pkg/dist/layers.go (about)

     1  package dist
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  
     7  	"github.com/buildpacks/lifecycle/api"
     8  	v1 "github.com/google/go-containerregistry/pkg/v1"
     9  	"github.com/google/go-containerregistry/pkg/v1/tarball"
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  type Descriptor interface {
    14  	API() *api.Version
    15  	Info() ModuleInfo
    16  	Order() Order
    17  	Stacks() []Stack
    18  	Targets() []Target
    19  }
    20  
    21  func LayerDiffID(layerTarPath string) (v1.Hash, error) {
    22  	fh, err := os.Open(filepath.Clean(layerTarPath))
    23  	if err != nil {
    24  		return v1.Hash{}, errors.Wrap(err, "opening tar file")
    25  	}
    26  	defer fh.Close()
    27  
    28  	layer, err := tarball.LayerFromFile(layerTarPath)
    29  	if err != nil {
    30  		return v1.Hash{}, errors.Wrap(err, "reading layer tar")
    31  	}
    32  
    33  	hash, err := layer.DiffID()
    34  	if err != nil {
    35  		return v1.Hash{}, errors.Wrap(err, "generating diff id")
    36  	}
    37  
    38  	return hash, nil
    39  }
    40  
    41  func AddToLayersMD(layerMD ModuleLayers, descriptor Descriptor, diffID string) {
    42  	info := descriptor.Info()
    43  	if _, ok := layerMD[info.ID]; !ok {
    44  		layerMD[info.ID] = map[string]ModuleLayerInfo{}
    45  	}
    46  	layerMD[info.ID][info.Version] = ModuleLayerInfo{
    47  		API:         descriptor.API(),
    48  		Stacks:      descriptor.Stacks(),
    49  		Targets:     descriptor.Targets(),
    50  		Order:       descriptor.Order(),
    51  		LayerDiffID: diffID,
    52  		Homepage:    info.Homepage,
    53  		Name:        info.Name,
    54  	}
    55  }