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