-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtemplate.go
114 lines (96 loc) · 2.66 KB
/
template.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package changelog
import (
"strings"
"text/template"
"github.com/Masterminds/sprig"
)
const defaultReleaseNoteTemplate = `{{with .Labels | filterPrefix "service/" true | sortAlpha }}{{if len . | lt 0 }}**{{. | join ", " }}:** {{end}}{{end}}{{.Text }} ([{{.PRNumber}}]({{.PRURL}}) by [{{.Author}}]({{.AuthorURL}}))`
const defaultChangelogTemplate = `
{{- $breaking := newStringList -}}
{{- $features := newStringList -}}
{{- $improvements := newStringList -}}
{{- $bugs := newStringList -}}
{{- range . -}}
{{if .BreakingChange -}}
{{$breaking = append $breaking (renderReleaseNote .) -}}
{{else if or (has "new-resource" .Labels) (has "new-data-source" .Labels) -}}
{{$features = append $features (renderReleaseNote .) -}}
{{else if not .Bug -}}
{{$improvements = append $improvements (renderReleaseNote .) -}}
{{else -}}
{{$bugs = append $bugs (renderReleaseNote .) -}}
{{end -}}
{{- end -}}
{{- if gt (len $breaking) 0 -}}
BREAKING CHANGES
{{range $breaking | sortAlpha -}}
* {{. }}
{{end -}}
{{- end -}}
{{- if gt (len $features) 0}}
FEATURES
{{range $features | sortAlpha -}}
* {{. }}
{{end -}}
{{- end -}}
{{- if gt (len $improvements) 0}}
IMPROVEMENTS
{{range $improvements | sortAlpha -}}
* {{. }}
{{end -}}
{{- end -}}
{{- if gt (len $bugs) 0}}
BUGS
{{range $bugs | sortAlpha -}}
* {{. }}
{{end -}}
{{- end -}}
`
func filterPrefix(prefix string, trim bool, data []string) []string {
result := []string{}
for _, s := range data {
if strings.HasPrefix(s, prefix) {
if trim {
s = strings.TrimPrefix(s, prefix)
}
result = append(result, s)
}
}
return result
}
func newStringList() []string {
return make([]string, 0)
}
func renderReleaseNoteFunc(templateText string) func(ReleaseNote) (string, error) {
return func(note ReleaseNote) (string, error) {
return render(templateText, note, nil)
}
}
func renderChangelog(changelogTemplateText, releaseNoteTemplateText string, notes []ReleaseNote) (string, error) {
funcs := template.FuncMap{
"renderReleaseNote": renderReleaseNoteFunc(releaseNoteTemplateText),
}
return render(changelogTemplateText, notes, funcs)
}
func render(templateText string, data interface{}, additionalFuncs template.FuncMap) (string, error) {
const renderTemplateName = "render"
tmpl := template.New(renderTemplateName)
funcs := sprig.TxtFuncMap()
for n, f := range additionalFuncs {
funcs[n] = f
}
funcs["filterPrefix"] = filterPrefix
funcs["newStringList"] = newStringList
tmpl = tmpl.Funcs(funcs)
var err error
tmpl, err = tmpl.Parse(templateText)
if err != nil {
return "", err
}
builder := &strings.Builder{}
err = tmpl.Execute(builder, data)
if err != nil {
return "", err
}
return builder.String(), nil
}