git-chglog/cmd/git-chglog/initializer.go
Derek Smith ae3382b7c8
chore(ci): add golangci-lint action and apply linting changes (#120)
BREAKING CHANGE: `JiraIssueId` has been renamed to `JiraIssueID`. This impacts the value for `pattern_maps` in `config.yml`.

* chore(ci): add golangci-lint action

* chore(lint): address errcheck lint failures

* chore(lint): address misspell lint failures

* chore(lint): address gocritic lint failures

* chore(lint): address golint lint failures

* chore(lint): address structcheck lint failures

* chore(lint): address gosimple lint failures

* chore(lint): address gofmt lint failures

* chore(ci): port to official golangci-lint github action

* Update golangci configuration for better coverage

Signed-off-by: Khosrow Moossavi <khos2ow@gmail.com>

* fix: file is not goimports-ed

Signed-off-by: Khosrow Moossavi <khos2ow@gmail.com>

* fix: golint and exported functions comments

Signed-off-by: Khosrow Moossavi <khos2ow@gmail.com>

* chore(lint): address gosec G304 warning

* chore(lint): address uparam warnings

* chore(lint): address scopelint lint failures

* fix: cyclomatic complexity

Signed-off-by: Khosrow Moossavi <khos2ow@gmail.com>

* chore(lint): address prealloc warning, noting that we are warning for now

* chore(lint): address govet and errorlint failures

* chore: clean up defer logic when checking errors

Co-authored-by: Khosrow Moossavi <khos2ow@gmail.com>
2021-03-16 21:24:36 -05:00

95 lines
2.3 KiB
Go

package main
import (
"fmt"
"path/filepath"
"github.com/fatih/color"
chglog "github.com/git-chglog/git-chglog"
)
// Initializer ...
type Initializer struct {
ctx *InitContext
fs FileSystem
logger *chglog.Logger
questioner Questioner
configBuilder ConfigBuilder
templateBuilderFactory TemplateBuilderFactory
}
// NewInitializer ...
func NewInitializer(
ctx *InitContext,
fs FileSystem,
questioner Questioner,
configBuilder ConfigBuilder,
tplBuilderFactory TemplateBuilderFactory) *Initializer {
return &Initializer{
ctx: ctx,
fs: fs,
logger: chglog.NewLogger(ctx.Stdout, ctx.Stderr, false, false),
questioner: questioner,
configBuilder: configBuilder,
templateBuilderFactory: tplBuilderFactory,
}
}
// Run ...
func (init *Initializer) Run() int {
ans, err := init.questioner.Ask()
if err != nil {
init.logger.Error(err.Error())
return ExitCodeError
}
if err = init.fs.MkdirP(filepath.Join(init.ctx.WorkingDir, ans.ConfigDir)); err != nil {
init.logger.Error(err.Error())
return ExitCodeError
}
if err = init.generateConfig(ans); err != nil {
init.logger.Error(err.Error())
return ExitCodeError
}
if err = init.generateTemplate(ans); err != nil {
init.logger.Error(err.Error())
return ExitCodeError
}
success := color.CyanString("✔")
init.logger.Log(fmt.Sprintf(`
:sparkles: %s
%s %s
%s %s
`,
color.GreenString("Configuration file and template generation completed!"),
success,
filepath.Join(ans.ConfigDir, defaultConfigFilename),
success,
filepath.Join(ans.ConfigDir, defaultTemplateFilename),
))
return ExitCodeOK
}
func (init *Initializer) generateConfig(ans *Answer) error {
s, err := init.configBuilder.Build(ans)
if err != nil {
return err
}
return init.fs.WriteFile(filepath.Join(init.ctx.WorkingDir, ans.ConfigDir, defaultConfigFilename), []byte(s))
}
func (init *Initializer) generateTemplate(ans *Answer) error {
templateBuilder := init.templateBuilderFactory(ans.Template)
s, err := templateBuilder.Build(ans)
if err != nil {
return err
}
return init.fs.WriteFile(filepath.Join(init.ctx.WorkingDir, ans.ConfigDir, defaultTemplateFilename), []byte(s))
}