github.com/buildpack/pack@v0.5.0/cmd/pack/main.go (about) 1 package main 2 3 import ( 4 "os" 5 6 "github.com/heroku/color" 7 "github.com/pkg/errors" 8 "github.com/spf13/cobra" 9 10 "github.com/buildpack/pack" 11 "github.com/buildpack/pack/cmd" 12 "github.com/buildpack/pack/commands" 13 "github.com/buildpack/pack/config" 14 clilogger "github.com/buildpack/pack/internal/logging" 15 "github.com/buildpack/pack/logging" 16 ) 17 18 var packClient pack.Client 19 20 func main() { 21 // create logger with defaults 22 logger := clilogger.NewLogWithWriters(color.Stdout(), color.Stderr()) 23 24 cobra.EnableCommandSorting = false 25 cfg, err := initConfig() 26 if err != nil { 27 logger.Error(err.Error()) 28 os.Exit(1) 29 } 30 31 rootCmd := &cobra.Command{ 32 Use: "pack", 33 PersistentPreRun: func(cmd *cobra.Command, args []string) { 34 if fs := cmd.Flags(); fs != nil { 35 if flag, err := fs.GetBool("no-color"); err == nil { 36 color.Disable(flag) 37 } 38 if flag, err := fs.GetBool("quiet"); err == nil { 39 logger.WantQuiet(flag) 40 } 41 if flag, err := fs.GetBool("verbose"); err == nil { 42 logger.WantVerbose(flag) 43 } 44 if flag, err := fs.GetBool("timestamps"); err == nil { 45 logger.WantTime(flag) 46 } 47 } 48 49 packClient = initClient(logger) 50 }, 51 } 52 53 rootCmd.PersistentFlags().Bool("no-color", false, "Disable color output") 54 rootCmd.PersistentFlags().Bool("timestamps", false, "Enable timestamps in output") 55 rootCmd.PersistentFlags().BoolP("quiet", "q", false, "Show less output") 56 rootCmd.PersistentFlags().BoolP("verbose", "v", false, "Show more output") 57 commands.AddHelpFlag(rootCmd, "pack") 58 59 rootCmd.AddCommand(commands.Build(logger, cfg, &packClient)) 60 rootCmd.AddCommand(commands.Run(logger, cfg, &packClient)) 61 rootCmd.AddCommand(commands.Rebase(logger, cfg, &packClient)) 62 rootCmd.AddCommand(commands.InspectImage(logger, &cfg, &packClient)) 63 64 rootCmd.AddCommand(commands.CreateBuilder(logger, &packClient)) 65 rootCmd.AddCommand(commands.CreatePackage(logger, &packClient)) 66 rootCmd.AddCommand(commands.SetRunImagesMirrors(logger, cfg)) 67 rootCmd.AddCommand(commands.InspectBuilder(logger, cfg, &packClient)) 68 rootCmd.AddCommand(commands.SetDefaultBuilder(logger, cfg, &packClient)) 69 rootCmd.AddCommand(commands.SuggestBuilders(logger, &packClient)) 70 71 rootCmd.AddCommand(commands.SuggestStacks(logger)) 72 rootCmd.AddCommand(commands.Version(logger, cmd.Version)) 73 74 rootCmd.AddCommand(commands.CompletionCommand(logger)) 75 76 if err := rootCmd.Execute(); err != nil { 77 if commands.IsSoftError(err) { 78 os.Exit(2) 79 } 80 os.Exit(1) 81 } 82 } 83 84 func initConfig() (config.Config, error) { 85 path, err := config.DefaultConfigPath() 86 if err != nil { 87 return config.Config{}, errors.Wrap(err, "getting config path") 88 } 89 90 cfg, err := config.Read(path) 91 if err != nil { 92 return config.Config{}, errors.Wrap(err, "reading pack config") 93 } 94 return cfg, nil 95 } 96 97 func initClient(logger logging.Logger) pack.Client { 98 client, err := pack.NewClient(pack.WithLogger(logger)) 99 if err != nil { 100 exitError(logger, err) 101 } 102 return *client 103 } 104 105 func exitError(logger logging.Logger, err error) { 106 logger.Error(err.Error()) 107 os.Exit(1) 108 }