diff --git a/cmd/cmd.go b/cmd/cmd.go index e2ce403b93..87f2789bc2 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -83,6 +83,7 @@ func NewPackCommand(logger ConfigurableLogger) (*cobra.Command, error) { rootCmd.AddCommand(commands.Report(logger, pack.Version)) if cfg.Experimental { + rootCmd.AddCommand(commands.AddBuildpackRegistry(logger, cfg)) rootCmd.AddCommand(commands.RegisterBuildpack(logger, cfg, &packClient)) rootCmd.AddCommand(commands.YankBuildpack(logger, cfg, &packClient)) } diff --git a/internal/commands/add_buildpack_registry.go b/internal/commands/add_buildpack_registry.go new file mode 100644 index 0000000000..0b66b2b3fd --- /dev/null +++ b/internal/commands/add_buildpack_registry.go @@ -0,0 +1,65 @@ +package commands + +import ( + "fmt" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + + "github.com/buildpacks/pack/internal/style" + + "github.com/buildpacks/pack/internal/config" + "github.com/buildpacks/pack/logging" +) + +func AddBuildpackRegistry(logger logging.Logger, cfg config.Config) *cobra.Command { + var setDefault bool + + cmd := &cobra.Command{ + Use: "add-buildpack-registry ", + Args: cobra.ExactArgs(3), + Short: "Adds a new buildpack registry to your pack config file", + RunE: logError(logger, func(cmd *cobra.Command, args []string) error { + newRegistry := config.Registry{ + Name: args[0], + Type: args[1], + URL: args[2], + } + + err := addRegistry(newRegistry, cfg, setDefault) + if err != nil { + return errors.Wrapf(err, "add buildpack registry") + } + logger.Infof("Successfully added %s to buildpack registries", style.Symbol(newRegistry.Name)) + + return nil + }), + } + cmd.Example = "pack add-buildpack-registry myregistry github https://github.com/buildpacks/mybuildpack" + cmd.Flags().BoolVar(&setDefault, "default", false, "Set this buildpack registry as the default") + AddHelpFlag(cmd, "add-registry") + + return cmd +} + +func addRegistry(registry config.Registry, cfg config.Config, setDefault bool) error { + for _, r := range cfg.Registries { + if r.Name == registry.Name { + return errors.Errorf( + "Buildpack registry %s already exists. First run %s and try again.", + style.Symbol(registry.Name), + style.Symbol(fmt.Sprintf("remove-buildpack-registry %s", registry.Name))) + } + } + + if setDefault { + cfg.DefaultRegistryName = registry.Name + } + cfg.Registries = append(cfg.Registries, registry) + configPath, err := config.DefaultConfigPath() + if err != nil { + return err + } + + return config.Write(cfg, configPath) +} diff --git a/internal/commands/add_buildpack_registry_test.go b/internal/commands/add_buildpack_registry_test.go new file mode 100644 index 0000000000..93dab40bd3 --- /dev/null +++ b/internal/commands/add_buildpack_registry_test.go @@ -0,0 +1,73 @@ +package commands_test + +import ( + "bytes" + "testing" + + "github.com/heroku/color" + "github.com/sclevine/spec" + "github.com/sclevine/spec/report" + "github.com/spf13/cobra" + + "github.com/buildpacks/pack/internal/commands" + "github.com/buildpacks/pack/internal/config" + ilogging "github.com/buildpacks/pack/internal/logging" + "github.com/buildpacks/pack/logging" + h "github.com/buildpacks/pack/testhelpers" +) + +func TestAddBuildpackRegistry(t *testing.T) { + color.Disable(true) + defer color.Disable(false) + + spec.Run(t, "Commands", testAddBuildpackRegistryCommand, spec.Parallel(), spec.Report(report.Terminal{})) +} + +func testAddBuildpackRegistryCommand(t *testing.T, when spec.G, it spec.S) { + var ( + command *cobra.Command + logger logging.Logger + outBuf bytes.Buffer + cfg config.Config + ) + + when("AddBuildpackRegistry", func() { + it.Before(func() { + logger = ilogging.NewLogWithWriters(&outBuf, &outBuf) + cfg = config.Config{} + + command = commands.AddBuildpackRegistry(logger, cfg) + }) + + it("fails with missing args", func() { + err := command.Execute() + h.AssertError(t, err, "accepts 3 arg") + }) + + it("should successfully add a new registry", func() { + command.SetArgs([]string{"bp", "https://github.com/buildpacks/registry-index/", "github"}) + command.Execute() + + output := outBuf.String() + h.AssertContains(t, output, "Successfully added 'bp' to buildpack registries") + }) + + it("should throw error when registry already exists", func() { + cfg = config.Config{ + Registries: []config.Registry{ + { + Name: "bp", + Type: "github", + URL: "https://github.com/buildpacks/registry-index/", + }, + }, + } + command = commands.AddBuildpackRegistry(logger, cfg) + command.SetArgs([]string{"bp", "https://github.com/buildpacks/registry-index/", "github"}) + command.Execute() + + output := outBuf.String() + h.AssertContains(t, output, "Buildpack registry 'bp' already exists. First run 'remove-buildpack-registry bp' and try again.") + }) + }) +}