github.com/YousefHaggyHeroku/pack@v1.5.5/internal/config/config.go (about) 1 package config 2 3 import ( 4 "os" 5 "path/filepath" 6 7 "github.com/BurntSushi/toml" 8 "github.com/pkg/errors" 9 10 "github.com/YousefHaggyHeroku/pack/internal/style" 11 ) 12 13 type Config struct { 14 // Deprecated: Use DefaultRegistryName instead. See https://github.com/YousefHaggyHeroku/pack/issues/747. 15 DefaultRegistry string `toml:"default-registry-url,omitempty"` 16 DefaultRegistryName string `toml:"default-registry,omitempty"` 17 DefaultBuilder string `toml:"default-builder-image,omitempty"` 18 Experimental bool `toml:"experimental,omitempty"` 19 RunImages []RunImage `toml:"run-images"` 20 TrustedBuilders []TrustedBuilder `toml:"trusted-builders,omitempty"` 21 Registries []Registry `toml:"registries,omitempty"` 22 } 23 24 type Registry struct { 25 Name string `toml:"name"` 26 Type string `toml:"type"` 27 URL string `toml:"url"` 28 } 29 30 type RunImage struct { 31 Image string `toml:"image"` 32 Mirrors []string `toml:"mirrors"` 33 } 34 35 type TrustedBuilder struct { 36 Name string `toml:"name"` 37 } 38 39 const OfficialRegistryName = "official" 40 41 func DefaultRegistry() Registry { 42 return Registry{ 43 OfficialRegistryName, 44 "github", 45 "https://github.com/buildpacks/registry-index", 46 } 47 } 48 49 func DefaultConfigPath() (string, error) { 50 home, err := PackHome() 51 if err != nil { 52 return "", errors.Wrap(err, "getting pack home") 53 } 54 return filepath.Join(home, "config.toml"), nil 55 } 56 57 func PackHome() (string, error) { 58 packHome := os.Getenv("PACK_HOME") 59 if packHome == "" { 60 home, err := os.UserHomeDir() 61 if err != nil { 62 return "", errors.Wrap(err, "getting user home") 63 } 64 packHome = filepath.Join(home, ".pack") 65 } 66 return packHome, nil 67 } 68 69 func Read(path string) (Config, error) { 70 cfg := Config{} 71 _, err := toml.DecodeFile(path, &cfg) 72 if err != nil && !os.IsNotExist(err) { 73 return Config{}, errors.Wrapf(err, "failed to read config file at path %s", path) 74 } 75 76 return cfg, nil 77 } 78 79 func Write(cfg Config, path string) error { 80 if err := MkdirAll(filepath.Dir(path)); err != nil { 81 return err 82 } 83 w, err := os.Create(path) 84 if err != nil { 85 return err 86 } 87 defer w.Close() 88 89 return toml.NewEncoder(w).Encode(cfg) 90 } 91 92 func MkdirAll(path string) error { 93 return os.MkdirAll(path, 0777) 94 } 95 96 func SetRunImageMirrors(cfg Config, image string, mirrors []string) Config { 97 for i := range cfg.RunImages { 98 if cfg.RunImages[i].Image == image { 99 cfg.RunImages[i].Mirrors = mirrors 100 return cfg 101 } 102 } 103 cfg.RunImages = append(cfg.RunImages, RunImage{Image: image, Mirrors: mirrors}) 104 return cfg 105 } 106 107 func GetRegistries(cfg Config) []Registry { 108 return append(cfg.Registries, DefaultRegistry()) 109 } 110 111 func GetRegistry(cfg Config, registryName string) (Registry, error) { 112 if registryName == "" && cfg.DefaultRegistryName != "" { 113 registryName = cfg.DefaultRegistryName 114 } 115 if registryName == "" && cfg.DefaultRegistryName == "" { 116 registryName = OfficialRegistryName 117 } 118 if registryName != "" { 119 for _, registry := range GetRegistries(cfg) { 120 if registry.Name == registryName { 121 return registry, nil 122 } 123 } 124 } 125 return Registry{}, errors.Errorf("registry %s is not defined in your config file", style.Symbol(registryName)) 126 }