github.com/fredbi/git-chglog@v0.0.0-20190706071416-d35c598eac81/cmd/git-chglog/cli.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"path/filepath"
     7  	"time"
     8  
     9  	"github.com/fatih/color"
    10  	chglog "github.com/fredbi/git-chglog"
    11  )
    12  
    13  // CLI ...
    14  type CLI struct {
    15  	ctx              *CLIContext
    16  	fs               FileSystem
    17  	logger           *Logger
    18  	configLoader     ConfigLoader
    19  	generator        Generator
    20  	processorFactory *ProcessorFactory
    21  }
    22  
    23  // NewCLI ...
    24  func NewCLI(
    25  	ctx *CLIContext, fs FileSystem,
    26  	configLoader ConfigLoader,
    27  	generator Generator,
    28  ) *CLI {
    29  	silent := false
    30  	if ctx.Silent || ctx.OutputPath == "" {
    31  		silent = true
    32  	}
    33  
    34  	return &CLI{
    35  		ctx:              ctx,
    36  		fs:               fs,
    37  		logger:           NewLogger(ctx.Stdout, ctx.Stderr, silent, ctx.NoEmoji),
    38  		configLoader:     configLoader,
    39  		generator:        generator,
    40  		processorFactory: NewProcessorFactory(),
    41  	}
    42  }
    43  
    44  // Run ...
    45  func (c *CLI) Run() int {
    46  	start := time.Now()
    47  
    48  	if c.ctx.NoColor {
    49  		color.NoColor = true
    50  	}
    51  
    52  	c.logger.Log(":watch: Generating changelog ...")
    53  
    54  	config, err := c.prepareConfig()
    55  	if err != nil {
    56  		c.logger.Error(err.Error())
    57  		return ExitCodeError
    58  	}
    59  
    60  	changelogConfig, err := c.createChangelogConfig(config)
    61  	if err != nil {
    62  		c.logger.Error(err.Error())
    63  		return ExitCodeError
    64  	}
    65  
    66  	w, err := c.createOutputWriter()
    67  	if err != nil {
    68  		c.logger.Error(err.Error())
    69  		return ExitCodeError
    70  	}
    71  
    72  	err = c.generator.Generate(w, c.ctx.Query, changelogConfig)
    73  	if err != nil {
    74  		c.logger.Error(err.Error())
    75  		return ExitCodeError
    76  	}
    77  
    78  	c.logger.Log(fmt.Sprintf(":sparkles: Generate of %s is completed! (%s)",
    79  		color.GreenString("\""+c.ctx.OutputPath+"\""),
    80  		color.New(color.Bold).SprintFunc()(time.Since(start).String()),
    81  	))
    82  
    83  	return ExitCodeOK
    84  }
    85  
    86  func (c *CLI) prepareConfig() (*Config, error) {
    87  	config, err := c.configLoader.Load(c.ctx.ConfigPath)
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  
    92  	err = config.Normalize(c.ctx)
    93  	if err != nil {
    94  		return nil, err
    95  	}
    96  
    97  	config.Convert(c.ctx)
    98  
    99  	return config, err
   100  }
   101  
   102  func (c *CLI) createChangelogConfig(config *Config) (*chglog.Config, error) {
   103  	processor, err := c.processorFactory.Create(config)
   104  	if err != nil {
   105  		return nil, err
   106  	}
   107  
   108  	changelogConfig := config.Convert(c.ctx)
   109  	changelogConfig.Options.Processor = processor
   110  
   111  	return changelogConfig, nil
   112  }
   113  
   114  func (c *CLI) createOutputWriter() (io.Writer, error) {
   115  	if c.ctx.OutputPath == "" {
   116  		return c.ctx.Stdout, nil
   117  	}
   118  
   119  	out := c.ctx.OutputPath
   120  	dir := filepath.Dir(out)
   121  	err := c.fs.MkdirP(dir)
   122  	if err != nil {
   123  		return nil, err
   124  	}
   125  
   126  	file, err := c.fs.Create(out)
   127  	if err != nil {
   128  		return nil, err
   129  	}
   130  
   131  	return file, nil
   132  }