github.com/fredbi/git-chglog@v0.0.0-20190706071416-d35c598eac81/cmd/git-chglog/kac_template_builder.go (about) 1 package main 2 3 import "fmt" 4 5 type kacTemplateBuilderImpl struct{} 6 7 // NewKACTemplateBuilder ... 8 func NewKACTemplateBuilder() TemplateBuilder { 9 return &kacTemplateBuilderImpl{} 10 } 11 12 // Build ... 13 func (t *kacTemplateBuilderImpl) Build(ans *Answer) (string, error) { 14 // unreleased 15 tpl := t.unreleased(ans.Style, ans.CommitMessageFormat) 16 17 // version start 18 tpl += "\n{{ range .Versions }}\n" 19 20 tpl += t.versionHeader(ans.Style) 21 22 // commits 23 tpl += t.commits(".CommitGroups", ans.CommitMessageFormat) 24 25 // revert 26 if ans.IncludeReverts { 27 tpl += t.reverts() 28 } 29 30 // merges 31 if ans.IncludeMerges { 32 tpl += t.merges(ans.Style) 33 } 34 35 // notes 36 tpl += t.notes() 37 38 // versions end 39 tpl += "\n{{ end -}}" 40 41 // footer (links) 42 tpl += t.footer(ans.Style) 43 44 return tpl, nil 45 } 46 47 func (t *kacTemplateBuilderImpl) unreleased(style, format string) string { 48 var ( 49 id = "" 50 title = "Unreleased" 51 commits = t.commits(".Unreleased.CommitGroups", format) 52 ) 53 54 switch style { 55 case styleGitHub, styleGitLab, styleBitbucket: 56 id = "<a name=\"unreleased\"></a>\n" 57 title = fmt.Sprintf("[%s]", title) 58 } 59 60 return fmt.Sprintf(`{{ if .Versions -}} 61 %s## %s 62 63 {{ if .Unreleased.CommitGroups -}} 64 %s{{ end -}} 65 {{ end -}} 66 `, id, title, commits) 67 } 68 69 func (t *kacTemplateBuilderImpl) versionHeader(style string) string { 70 var ( 71 id = "" 72 tagName = "{{ .Tag.Name }}" 73 date = "{{ datetime \"2006-01-02\" .Tag.Date }}" 74 ) 75 76 switch style { 77 case styleGitHub, styleGitLab, styleBitbucket: 78 id = templateTagNameAnchor 79 tagName = "{{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }}" 80 } 81 82 return fmt.Sprintf("%s## %s - %s\n", id, tagName, date) 83 } 84 85 func (t *kacTemplateBuilderImpl) commits(commitGroups, format string) string { 86 var ( 87 body string 88 ) 89 90 switch format { 91 case fmtSubject.display: 92 body = `{{ range .Commits -}} 93 - {{ .Header }} 94 {{ end }}` 95 96 default: 97 body = `### {{ .Title }} 98 {{ range .Commits -}} 99 - {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }} 100 {{ end }}` 101 } 102 103 return fmt.Sprintf(`{{ range %s -}} 104 %s 105 {{ end -}} 106 `, commitGroups, body) 107 } 108 109 func (t *kacTemplateBuilderImpl) reverts() string { 110 return ` 111 {{- if .RevertCommits -}} 112 ### Reverts 113 {{ range .RevertCommits -}} 114 - {{ .Revert.Header }} 115 {{ end }} 116 {{ end -}} 117 ` 118 } 119 120 func (t *kacTemplateBuilderImpl) merges(style string) string { 121 var title string 122 123 switch style { 124 case styleGitHub, styleBitbucket: 125 title = "Pull Requests" 126 case styleGitLab: 127 title = "Merge Requests" 128 default: 129 title = "Merges" 130 } 131 132 return fmt.Sprintf(` 133 {{- if .MergeCommits -}} 134 ### %s 135 {{ range .MergeCommits -}} 136 - {{ .Header }} 137 {{ end }} 138 {{ end -}} 139 `, title) 140 } 141 142 func (*kacTemplateBuilderImpl) notes() string { 143 return ` 144 {{- if .NoteGroups -}} 145 {{ range .NoteGroups -}} 146 ### {{ .Title }} 147 {{ range .Notes }} 148 {{ .Body }} 149 {{ end }} 150 {{ end -}} 151 {{ end -}}` 152 } 153 154 func (*kacTemplateBuilderImpl) footer(style string) string { 155 switch style { 156 case styleGitHub, styleGitLab: 157 return ` 158 159 {{- if .Versions }} 160 [Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD 161 {{ range .Versions -}} 162 {{ if .Tag.Previous -}} 163 [{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }} 164 {{ end -}} 165 {{ end -}} 166 {{ end -}}` 167 case styleBitbucket: 168 return ` 169 170 {{- if .Versions }} 171 [Unreleased]: {{ .Info.RepositoryURL }}/compare/HEAD..{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }} 172 {{ range .Versions -}} 173 {{ if .Tag.Previous -}} 174 [{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Name }}..{{ .Tag.Previous.Name }} 175 {{ end -}} 176 {{ end -}} 177 {{ end -}}` 178 default: 179 return "" 180 } 181 }