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 }