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  }