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  }