Skip to content

Commit

Permalink
feat: Add template for Keep a changelog to the --init option
Browse files Browse the repository at this point in the history
  • Loading branch information
wadackel committed Mar 1, 2018
1 parent 4059813 commit 29878a5
Show file tree
Hide file tree
Showing 11 changed files with 367 additions and 194 deletions.
24 changes: 11 additions & 13 deletions .chglog/CHANGELOG.tpl.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
## {{if .Versions}}[Unreleased]{{end}}
{{range .Versions}}
<a name="{{.Tag.Name}}"></a>
## {{if .Tag.Previous}}[{{.Tag.Name}}]({{$.Info.RepositoryURL}}/compare/{{.Tag.Previous.Name}}...{{.Tag.Name}}){{else}}{{.Tag.Name}}{{end}} ({{datetime "2006-01-02" .Tag.Date}})
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{.Subject}}{{end}}
## {{if .Tag.Previous}}[{{.Tag.Name}}]{{else}}{{.Tag.Name}}{{end}} - {{datetime "2006-01-02" .Tag.Date}}{{range .CommitGroups}}
### {{.Title}}{{range .Commits}}
- {{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
### Reverts
{{range .RevertCommits}}
* {{.Revert.Header}}{{end}}
### Reverts{{range .RevertCommits}}
- {{.Revert.Header}}{{end}}
{{end}}{{if .MergeCommits}}
### Pull Requests
{{range .MergeCommits}}
* {{.Header}}{{end}}
### Pull Requests{{range .MergeCommits}}
- {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}{{end}}{{if .Versions}}
[Unreleased]: {{.Info.RepositoryURL}}/compare/{{$latest := index .Versions 0}}{{$latest.Tag.Name}}...HEAD{{range .Versions}}{{if .Tag.Previous}}
[{{.Tag.Name}}]: {{$.Info.RepositoryURL}}/compare/{{.Tag.Previous.Name}}...{{.Tag.Name}}{{end}}{{end}}
{{end}}
24 changes: 12 additions & 12 deletions .chglog/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,23 @@ info:
repository_url: https://github.com/git-chglog/git-chglog
options:
commits:
filters:
Type:
- feat
- fix
- perf
- refactor
# filters:
# Type:
# - feat
# - fix
# - perf
# - refactor
commit_groups:
title_maps:
feat: Features
fix: Bug Fixes
perf: Performance Improvements
refactor: Code Refactoring
# title_maps:
# feat: Features
# fix: Bug Fixes
# perf: Performance Improvements
# refactor: Code Refactoring
header:
pattern: "^(\\w*)\\:\\s(.*)$"
pattern_maps:
- Type
- Subject
notes:
keywords:
- BREAKING CHANGE
- BREAKING CHANGE
136 changes: 136 additions & 0 deletions cmd/git-chglog/custom_template_builder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package main

import "fmt"

type customTemplateBuilderImpl struct{}

// NewCustomTemplateBuilder ...
func NewCustomTemplateBuilder() TemplateBuilder {
return &customTemplateBuilderImpl{}
}

// Build ...
func (t *customTemplateBuilderImpl) Build(ans *Answer) (string, error) {
// versions
tpl := "{{range .Versions}}\n"

// version header
tpl += t.versionHeader(ans.Style, ans.Template)

// commits
tpl += t.commits(ans.Template, ans.CommitMessageFormat)

// revert
if ans.IncludeReverts {
tpl += t.reverts()
}

// merges
if ans.IncludeMerges {
tpl += t.merges(ans.Style)
}

// notes
tpl += t.notes()

// versions end
tpl += "\n{{end}}"

return tpl, nil
}

func (*customTemplateBuilderImpl) versionHeader(style, template string) string {
var (
tpl string
tagName = "{{.Tag.Name}}"
date = "{{datetime \"2006-01-02\" .Tag.Date}}"
)

// parts
switch style {
case styleGitHub:
tpl = "<a name=\"{{.Tag.Name}}\"></a>\n"
tagName = "{{if .Tag.Previous}}[{{.Tag.Name}}]({{$.Info.RepositoryURL}}/compare/{{.Tag.Previous.Name}}...{{.Tag.Name}}){{else}}{{.Tag.Name}}{{end}}"
}

// format
switch template {
case tplStandard:
tpl = fmt.Sprintf("%s## %s (%s)\n",
tpl,
tagName,
date,
)
case tplCool:
tpl = fmt.Sprintf("%s## %s\n\n> %s\n",
tpl,
tagName,
date,
)
}

return tpl
}

func (*customTemplateBuilderImpl) commits(template, format string) string {
var (
header string
body string
)

switch format {
case fmtSubject.Display:
body = `{{range .Commits}}
* {{.Header}}{{end}}
`

default:
if format == fmtTypeScopeSubject.Display {
header = "{{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}"
} else {
header = "{{.Subject}}"
}

body = fmt.Sprintf(`### {{.Title}}
{{range .Commits}}
* %s{{end}}
`, header)
}

return fmt.Sprintf(`{{range .CommitGroups}}
%s{{end}}`, body)
}

func (*customTemplateBuilderImpl) reverts() string {
return `{{if .RevertCommits}}
### Reverts
{{range .RevertCommits}}
* {{.Revert.Header}}{{end}}
{{end}}`
}

func (t *customTemplateBuilderImpl) merges(style string) string {
var title string

switch style {
case styleGitHub:
title = "Pull Requests"
default:
title = "Merges"
}

return fmt.Sprintf(`{{if .MergeCommits}}
### %s
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}`, title)
}

func (*customTemplateBuilderImpl) notes() string {
return `{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}`
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import (
"github.com/stretchr/testify/assert"
)

func TestTemplateBuilderDefault(t *testing.T) {
func TestCustomTemplateBuilderDefault(t *testing.T) {
assert := assert.New(t)
builder := NewTemplateBuilder()
builder := NewCustomTemplateBuilder()

out, err := builder.Build(&Answer{
Style: styleGitHub,
Expand All @@ -25,7 +25,7 @@ func TestTemplateBuilderDefault(t *testing.T) {
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{if ne .Scope ""}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
* {{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
### Reverts
{{range .RevertCommits}}
Expand All @@ -43,9 +43,9 @@ func TestTemplateBuilderDefault(t *testing.T) {
{{end}}`, out)
}

func TestTemplateBuilderNone(t *testing.T) {
func TestCustomTemplateBuilderNone(t *testing.T) {
assert := assert.New(t)
builder := NewTemplateBuilder()
builder := NewCustomTemplateBuilder()

out, err := builder.Build(&Answer{
Style: styleNone,
Expand All @@ -61,7 +61,7 @@ func TestTemplateBuilderNone(t *testing.T) {
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{if ne .Scope ""}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
* {{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
### Reverts
{{range .RevertCommits}}
Expand All @@ -79,9 +79,9 @@ func TestTemplateBuilderNone(t *testing.T) {
{{end}}`, out)
}

func TestTemplateBuilderCool(t *testing.T) {
func TestCustomTemplateBuilderCool(t *testing.T) {
assert := assert.New(t)
builder := NewTemplateBuilder()
builder := NewCustomTemplateBuilder()

out, err := builder.Build(&Answer{
Style: styleNone,
Expand All @@ -99,7 +99,7 @@ func TestTemplateBuilderCool(t *testing.T) {
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{if ne .Scope ""}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
* {{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
### Reverts
{{range .RevertCommits}}
Expand All @@ -117,9 +117,9 @@ func TestTemplateBuilderCool(t *testing.T) {
{{end}}`, out)
}

func TestTemplateBuilderSubjectOnly(t *testing.T) {
func TestCustomTemplateBuilderSubjectOnly(t *testing.T) {
assert := assert.New(t)
builder := NewTemplateBuilder()
builder := NewCustomTemplateBuilder()

out, err := builder.Build(&Answer{
Style: styleNone,
Expand Down Expand Up @@ -152,9 +152,9 @@ func TestTemplateBuilderSubjectOnly(t *testing.T) {
{{end}}`, out)
}

func TestTemplateBuilderSubject(t *testing.T) {
func TestCustomTemplateBuilderSubject(t *testing.T) {
assert := assert.New(t)
builder := NewTemplateBuilder()
builder := NewCustomTemplateBuilder()

out, err := builder.Build(&Answer{
Style: styleNone,
Expand Down Expand Up @@ -188,9 +188,9 @@ func TestTemplateBuilderSubject(t *testing.T) {
{{end}}`, out)
}

func TestTemplateBuilderIgnoreReverts(t *testing.T) {
func TestCustomTemplateBuilderIgnoreReverts(t *testing.T) {
assert := assert.New(t)
builder := NewTemplateBuilder()
builder := NewCustomTemplateBuilder()

out, err := builder.Build(&Answer{
Style: styleNone,
Expand Down Expand Up @@ -220,9 +220,9 @@ func TestTemplateBuilderIgnoreReverts(t *testing.T) {
{{end}}`, out)
}

func TestTemplateBuilderIgnoreMerges(t *testing.T) {
func TestCustomTemplateBuilderIgnoreMerges(t *testing.T) {
assert := assert.New(t)
builder := NewTemplateBuilder()
builder := NewCustomTemplateBuilder()

out, err := builder.Build(&Answer{
Style: styleNone,
Expand Down
32 changes: 16 additions & 16 deletions cmd/git-chglog/initializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ import (

// Initializer ...
type Initializer struct {
ctx *InitContext
client gitcmd.Client
fs FileSystem
logger *Logger
questioner Questioner
configBuilder ConfigBuilder
templateBuilder TemplateBuilder
ctx *InitContext
client gitcmd.Client
fs FileSystem
logger *Logger
questioner Questioner
configBuilder ConfigBuilder
templateBuilderFactory TemplateBuilderFactory
}

// NewInitializer ...
Expand All @@ -25,15 +25,14 @@ func NewInitializer(
fs FileSystem,
questioner Questioner,
configBuilder ConfigBuilder,
templateBuilder TemplateBuilder,
) *Initializer {
tplBuilderFactory TemplateBuilderFactory) *Initializer {
return &Initializer{
ctx: ctx,
fs: fs,
logger: NewLogger(ctx.Stdout, ctx.Stderr, false, false),
questioner: questioner,
configBuilder: configBuilder,
templateBuilder: templateBuilder,
ctx: ctx,
fs: fs,
logger: NewLogger(ctx.Stdout, ctx.Stderr, false, false),
questioner: questioner,
configBuilder: configBuilder,
templateBuilderFactory: tplBuilderFactory,
}
}

Expand Down Expand Up @@ -86,7 +85,8 @@ func (init *Initializer) generateConfig(ans *Answer) error {
}

func (init *Initializer) generateTemplate(ans *Answer) error {
s, err := init.templateBuilder.Build(ans)
templateBuilder := init.templateBuilderFactory(ans.Template)
s, err := templateBuilder.Build(ans)
if err != nil {
return err
}
Expand Down
4 changes: 3 additions & 1 deletion cmd/git-chglog/initializer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ func TestInitializer(t *testing.T) {
mockFs,
questioner,
configBuilder,
tplBuilder,
func(t string) TemplateBuilder {
return tplBuilder
},
)

assert.Equal(ExitCodeOK, init.Run())
Expand Down
Loading

0 comments on commit 29878a5

Please sign in to comment.