github.com/YousefHaggyHeroku/pack@v1.5.5/internal/stack/mixins.go (about)

     1  package stack
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"strings"
     7  
     8  	"github.com/YousefHaggyHeroku/pack/internal/stringset"
     9  	"github.com/YousefHaggyHeroku/pack/internal/style"
    10  )
    11  
    12  const MixinsLabel = "io.buildpacks.stack.mixins"
    13  
    14  func ValidateMixins(buildImageName string, buildImageMixins []string, runImageName string, runImageMixins []string) error {
    15  	if invalid := FindStageMixins(buildImageMixins, "run"); len(invalid) > 0 {
    16  		sort.Strings(invalid)
    17  		return fmt.Errorf("%s contains run-only mixin(s): %s", style.Symbol(buildImageName), strings.Join(invalid, ", "))
    18  	}
    19  
    20  	if invalid := FindStageMixins(runImageMixins, "build"); len(invalid) > 0 {
    21  		sort.Strings(invalid)
    22  		return fmt.Errorf("%s contains build-only mixin(s): %s", style.Symbol(runImageName), strings.Join(invalid, ", "))
    23  	}
    24  
    25  	buildImageMixins = removeStageMixins(buildImageMixins, "build")
    26  	runImageMixins = removeStageMixins(runImageMixins, "run")
    27  
    28  	_, missing, _ := stringset.Compare(runImageMixins, buildImageMixins)
    29  
    30  	if len(missing) > 0 {
    31  		sort.Strings(missing)
    32  		return fmt.Errorf("%s missing required mixin(s): %s", style.Symbol(runImageName), strings.Join(missing, ", "))
    33  	}
    34  	return nil
    35  }
    36  
    37  func FindStageMixins(mixins []string, stage string) []string {
    38  	var found []string
    39  	for _, m := range mixins {
    40  		if strings.HasPrefix(m, stage+":") {
    41  			found = append(found, m)
    42  		}
    43  	}
    44  	return found
    45  }
    46  
    47  func removeStageMixins(mixins []string, stage string) []string {
    48  	var filtered []string
    49  	for _, m := range mixins {
    50  		if !strings.HasPrefix(m, stage+":") {
    51  			filtered = append(filtered, m)
    52  		}
    53  	}
    54  	return filtered
    55  }