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 }