feat: Update template format to human readable

This commit is contained in:
tsuyoshiwada 2018-05-04 10:07:09 +09:00
parent 5ce1760d0f
commit 25c41823a3
4 changed files with 404 additions and 232 deletions

View file

@ -12,7 +12,7 @@ func NewCustomTemplateBuilder() TemplateBuilder {
// Build ...
func (t *customTemplateBuilderImpl) Build(ans *Answer) (string, error) {
// versions
tpl := "{{range .Versions}}\n"
tpl := "{{ range .Versions }}\n"
// version header
tpl += t.versionHeader(ans.Style, ans.Template)
@ -34,7 +34,7 @@ func (t *customTemplateBuilderImpl) Build(ans *Answer) (string, error) {
tpl += t.notes()
// versions end
tpl += "\n{{end}}"
tpl += "{{ end -}}"
return tpl, nil
}
@ -42,30 +42,30 @@ func (t *customTemplateBuilderImpl) Build(ans *Answer) (string, error) {
func (*customTemplateBuilderImpl) versionHeader(style, template string) string {
var (
tpl string
tagName = "{{.Tag.Name}}"
date = "{{datetime \"2006-01-02\" .Tag.Date}}"
tagName = "{{ .Tag.Name }}"
date = "{{ datetime \"2006-01-02\" .Tag.Date }}"
)
// parts
switch style {
case styleGitHub, styleGitLab:
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}}"
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 }}"
case styleBitbucket:
tpl = "<a name=\"{{.Tag.Name}}\"></a>\n"
tagName = "{{if .Tag.Previous}}[{{.Tag.Name}}]({{$.Info.RepositoryURL}}/compare/{{.Tag.Name}}..{{.Tag.Previous.Name}}){{else}}{{.Tag.Name}}{{end}}"
tpl = "<a name=\"{{ .Tag.Name }}\"></a>\n"
tagName = "{{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Name }}..{{ .Tag.Previous.Name }}){{ else }}{{ .Tag.Name }}{{ end }}"
}
// format
switch template {
case tplStandard:
tpl = fmt.Sprintf("%s## %s (%s)\n",
tpl = fmt.Sprintf("%s## %s (%s)\n\n",
tpl,
tagName,
date,
)
case tplCool:
tpl = fmt.Sprintf("%s## %s\n\n> %s\n",
tpl = fmt.Sprintf("%s## %s\n\n> %s\n\n",
tpl,
tagName,
date,
@ -83,33 +83,40 @@ func (*customTemplateBuilderImpl) commits(template, format string) string {
switch format {
case fmtSubject.Display:
body = `{{range .Commits}}
* {{.Header}}{{end}}
`
body = `{{ range .Commits -}}
* {{ .Header }}
{{ end }}`
default:
if format == fmtTypeScopeSubject.Display {
header = "{{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}"
header = "{{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}"
} else {
header = "{{.Subject}}"
header = "{{ .Subject }}"
}
body = fmt.Sprintf(`### {{.Title}}
{{range .Commits}}
* %s{{end}}
`, header)
body = fmt.Sprintf(`### {{ .Title }}
{{ range .Commits -}}
* %s
{{ end }}`, header)
}
return fmt.Sprintf(`{{range .CommitGroups}}
%s{{end}}`, body)
return fmt.Sprintf(`{{ range .CommitGroups -}}
%s
{{ end -}}
`, body)
}
func (*customTemplateBuilderImpl) reverts() string {
return `{{if .RevertCommits}}
return `
{{- if .RevertCommits -}}
### Reverts
{{range .RevertCommits}}
* {{.Revert.Header}}{{end}}
{{end}}`
{{ range .RevertCommits -}}
* {{ .Revert.Header }}
{{ end }}
{{ end -}}
`
}
func (t *customTemplateBuilderImpl) merges(style string) string {
@ -124,18 +131,27 @@ func (t *customTemplateBuilderImpl) merges(style string) string {
title = "Merges"
}
return fmt.Sprintf(`{{if .MergeCommits}}
return fmt.Sprintf(`
{{- if .MergeCommits -}}
### %s
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}`, title)
{{ range .MergeCommits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
`, title)
}
func (*customTemplateBuilderImpl) notes() string {
return `{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}`
return `
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
`
}

View file

@ -19,28 +19,44 @@ func TestCustomTemplateBuilderDefault(t *testing.T) {
})
assert.Nil(err)
assert.Equal(`{{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}}
* {{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
assert.Equal(`{{ 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 -}}
* {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{- if .RevertCommits -}}
### Reverts
{{range .RevertCommits}}
* {{.Revert.Header}}{{end}}
{{end}}{{if .MergeCommits}}
{{ range .RevertCommits -}}
* {{ .Revert.Header }}
{{ end }}
{{ end -}}
{{- if .MergeCommits -}}
### Pull Requests
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}`, out)
{{ range .MergeCommits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}
func TestCustomTemplateBuilderNone(t *testing.T) {
@ -56,65 +72,43 @@ func TestCustomTemplateBuilderNone(t *testing.T) {
})
assert.Nil(err)
assert.Equal(`{{range .Versions}}
## {{.Tag.Name}} ({{datetime "2006-01-02" .Tag.Date}})
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
assert.Equal(`{{ range .Versions }}
## {{ .Tag.Name }} ({{ 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}}
{{end}}{{if .MergeCommits}}
{{ range .RevertCommits -}}
* {{ .Revert.Header }}
{{ end }}
{{ end -}}
{{- if .MergeCommits -}}
### Merges
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}`, out)
}
func TestCustomTemplateBuilderCool(t *testing.T) {
assert := assert.New(t)
builder := NewCustomTemplateBuilder()
{{ range .MergeCommits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
out, err := builder.Build(&Answer{
Style: styleNone,
CommitMessageFormat: fmtTypeScopeSubject.Display,
Template: tplCool,
IncludeMerges: true,
IncludeReverts: true,
})
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
assert.Nil(err)
assert.Equal(`{{range .Versions}}
## {{.Tag.Name}}
> {{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}}
{{end}}{{if .MergeCommits}}
### Merges
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}`, out)
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}
func TestCustomTemplateBuilderSubjectOnly(t *testing.T) {
@ -130,26 +124,41 @@ func TestCustomTemplateBuilderSubjectOnly(t *testing.T) {
})
assert.Nil(err)
assert.Equal(`{{range .Versions}}
## {{.Tag.Name}} ({{datetime "2006-01-02" .Tag.Date}})
{{range .CommitGroups}}
{{range .Commits}}
* {{.Header}}{{end}}
{{end}}{{if .RevertCommits}}
assert.Equal(`{{ range .Versions }}
## {{ .Tag.Name }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .CommitGroups -}}
{{ range .Commits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
{{- if .RevertCommits -}}
### Reverts
{{range .RevertCommits}}
* {{.Revert.Header}}{{end}}
{{end}}{{if .MergeCommits}}
{{ range .RevertCommits -}}
* {{ .Revert.Header }}
{{ end }}
{{ end -}}
{{- if .MergeCommits -}}
### Merges
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}`, out)
{{ range .MergeCommits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}
func TestCustomTemplateBuilderSubject(t *testing.T) {
@ -165,27 +174,43 @@ func TestCustomTemplateBuilderSubject(t *testing.T) {
})
assert.Nil(err)
assert.Equal(`{{range .Versions}}
## {{.Tag.Name}} ({{datetime "2006-01-02" .Tag.Date}})
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
assert.Equal(`{{ range .Versions }}
## {{ .Tag.Name }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
* {{ .Subject }}
{{ end }}
{{ end -}}
{{- if .RevertCommits -}}
### Reverts
{{range .RevertCommits}}
* {{.Revert.Header}}{{end}}
{{end}}{{if .MergeCommits}}
{{ range .RevertCommits -}}
* {{ .Revert.Header }}
{{ end }}
{{ end -}}
{{- if .MergeCommits -}}
### Merges
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}`, out)
{{ range .MergeCommits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}
func TestCustomTemplateBuilderIgnoreReverts(t *testing.T) {
@ -201,23 +226,35 @@ func TestCustomTemplateBuilderIgnoreReverts(t *testing.T) {
})
assert.Nil(err)
assert.Equal(`{{range .Versions}}
## {{.Tag.Name}} ({{datetime "2006-01-02" .Tag.Date}})
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{.Subject}}{{end}}
{{end}}{{if .MergeCommits}}
assert.Equal(`{{ range .Versions }}
## {{ .Tag.Name }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
* {{ .Subject }}
{{ end }}
{{ end -}}
{{- if .MergeCommits -}}
### Merges
{{range .MergeCommits}}
* {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}`, out)
{{ range .MergeCommits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}
func TestCustomTemplateBuilderIgnoreMerges(t *testing.T) {
@ -233,21 +270,87 @@ func TestCustomTemplateBuilderIgnoreMerges(t *testing.T) {
})
assert.Nil(err)
assert.Equal(`{{range .Versions}}
## {{.Tag.Name}} ({{datetime "2006-01-02" .Tag.Date}})
{{range .CommitGroups}}
### {{.Title}}
{{range .Commits}}
* {{.Subject}}{{end}}
{{end}}{{if .RevertCommits}}
assert.Equal(`{{ range .Versions }}
## {{ .Tag.Name }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
* {{ .Subject }}
{{ end }}
{{ end -}}
{{- if .RevertCommits -}}
### Reverts
{{range .RevertCommits}}
* {{.Revert.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}
{{end}}`, out)
{{ range .RevertCommits -}}
* {{ .Revert.Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}
func TestCustomTemplateBuilderCool(t *testing.T) {
assert := assert.New(t)
builder := NewCustomTemplateBuilder()
out, err := builder.Build(&Answer{
Style: styleNone,
CommitMessageFormat: fmtTypeScopeSubject.Display,
Template: tplCool,
IncludeMerges: true,
IncludeReverts: true,
})
assert.Nil(err)
assert.Equal(`{{ range .Versions }}
## {{ .Tag.Name }}
> {{ 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 }}
{{ end -}}
{{- if .MergeCommits -}}
### Merges
{{ range .MergeCommits -}}
* {{ .Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}`, out)
}

View file

@ -12,7 +12,11 @@ func NewKACTemplateBuilder() TemplateBuilder {
// Build ...
func (t *kacTemplateBuilderImpl) Build(ans *Answer) (string, error) {
// versions
tpl := "## {{if .Versions}}[Unreleased]{{end}}\n{{range .Versions}}\n"
tpl := `## {{ if .Versions }}[Unreleased]{{ end }}
{{ range .Versions }}
`
tpl += t.versionHeader(ans.Style)
// commits
@ -32,7 +36,7 @@ func (t *kacTemplateBuilderImpl) Build(ans *Answer) (string, error) {
tpl += t.notes()
// versions end
tpl += "{{end}}"
tpl += "{{ end -}}\n"
// footer (links)
tpl += t.footer(ans.Style)
@ -42,16 +46,16 @@ func (t *kacTemplateBuilderImpl) Build(ans *Answer) (string, error) {
func (t *kacTemplateBuilderImpl) versionHeader(style string) string {
var (
tagName = "{{.Tag.Name}}"
date = "{{datetime \"2006-01-02\" .Tag.Date}}"
tagName = "{{ .Tag.Name }}"
date = "{{ datetime \"2006-01-02\" .Tag.Date }}"
)
switch style {
case styleGitHub, styleGitLab, styleBitbucket:
tagName = "{{if .Tag.Previous}}[{{.Tag.Name}}]{{else}}{{.Tag.Name}}{{end}}"
tagName = "{{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }}"
}
return fmt.Sprintf("## %s - %s", tagName, date)
return fmt.Sprintf("## %s - %s\n", tagName, date)
}
func (t *kacTemplateBuilderImpl) commits(format string) string {
@ -61,24 +65,32 @@ func (t *kacTemplateBuilderImpl) commits(format string) string {
switch format {
case fmtSubject.Display:
body = `{{range .Commits}}
- {{.Header}}{{end}}`
body = `{{ range .Commits -}}
- {{ .Header }}
{{ end }}`
default:
body = `### {{.Title}}{{range .Commits}}
- {{if .Scope}}**{{.Scope}}:** {{end}}{{.Subject}}{{end}}`
body = `### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}`
}
return fmt.Sprintf(`{{range .CommitGroups}}
return fmt.Sprintf(`{{ range .CommitGroups -}}
%s
{{end}}`, body)
{{ end -}}
`, body)
}
func (t *kacTemplateBuilderImpl) reverts() string {
return `{{if .RevertCommits}}
### Reverts{{range .RevertCommits}}
- {{.Revert.Header}}{{end}}
{{end}}`
return `
{{- if .RevertCommits -}}
### Reverts
{{ range .RevertCommits -}}
- {{ .Revert.Header }}
{{ end }}
{{ end -}}
`
}
func (t *kacTemplateBuilderImpl) merges(style string) string {
@ -93,33 +105,51 @@ func (t *kacTemplateBuilderImpl) merges(style string) string {
title = "Merges"
}
return fmt.Sprintf(`{{if .MergeCommits}}
### %s{{range .MergeCommits}}
- {{.Header}}{{end}}
{{end}}`, title)
return fmt.Sprintf(`
{{- if .MergeCommits -}}
### %s
{{ range .MergeCommits -}}
- {{ .Header }}
{{ end }}
{{ end -}}
`, title)
}
func (*kacTemplateBuilderImpl) notes() string {
return `{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{end}}
{{end}}`
return `
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
`
}
func (*kacTemplateBuilderImpl) footer(style string) string {
switch style {
case styleGitHub, styleGitLab:
return `{{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}}`
return `
{{- 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 -}}`
case styleBitbucket:
return `{{if .Versions}}
[Unreleased]: {{.Info.RepositoryURL}}/compare/HEAD..{{$latest := index .Versions 0}}{{$latest.Tag.Name}}{{range .Versions}}{{if .Tag.Previous}}
[{{.Tag.Name}}]: {{$.Info.RepositoryURL}}/compare/{{.Tag.Name}}..{{.Tag.Previous.Name}}{{end}}{{end}}
{{end}}`
return `
{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/HEAD..{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Name }}..{{ .Tag.Previous.Name }}
{{ end -}}
{{ end -}}
{{ end -}}`
default:
return ""
}

View file

@ -19,24 +19,47 @@ func TestKACTemplateBuilderDefault(t *testing.T) {
})
assert.Nil(err)
assert.Equal(`## {{if .Versions}}[Unreleased]{{end}}
{{range .Versions}}
## {{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}}
{{end}}{{if .MergeCommits}}
### Pull Requests{{range .MergeCommits}}
- {{.Header}}{{end}}
{{end}}{{range .NoteGroups}}
### {{.Title}}
{{range .Notes}}
{{.Body}}
{{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}}`, out)
assert.Equal(`## {{ if .Versions }}[Unreleased]{{ end }}
{{ range .Versions }}
## {{ 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 }}
{{ end -}}
{{- if .MergeCommits -}}
### Pull Requests
{{ range .MergeCommits -}}
- {{ .Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ 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 -}}`, out)
}