/
changelog.go
73 lines (63 loc) · 1.91 KB
/
changelog.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
package gh2changelog
import (
"bufio"
"bytes"
"fmt"
"regexp"
"strings"
"time"
)
var (
versionLinkReg = regexp.MustCompile(`(?:^|\n)\*\*Full Changelog\*\*: (https://.*)$`)
semverFromLinkReg = regexp.MustCompile(`.*[./](v?[0-9]+\.[0-9]+\.[0-9]+)`)
newContribReg = regexp.MustCompile(`(?ms)## New Contributors.*\z`)
genCommentReg = regexp.MustCompile(`<!-- Release notes generated using configuration.*?-->`)
)
func convertKeepAChangelogFormat(md string, d time.Time) string {
md = strings.TrimSpace(genCommentReg.ReplaceAllString(md, ""))
var link string
md = versionLinkReg.ReplaceAllStringFunc(md, func(match string) string {
m := versionLinkReg.FindStringSubmatch(match)
link = m[1]
return ""
})
var semvStr string
if m := semverFromLinkReg.FindStringSubmatch(link); len(m) > 1 {
semvStr = m[1]
}
heading := fmt.Sprintf("## [%s](%s) - %s", semvStr, link, d.UTC().Format("2006-01-02"))
const origHeading = "## What's Changed"
if !strings.Contains(md, origHeading) {
// empty
return heading + "\n"
}
md = strings.Replace(md, origHeading, heading, 1)
md = strings.ReplaceAll(md, "\n* ", "\n- ")
md = newContribReg.ReplaceAllString(md, "")
return strings.TrimSpace(md) + "\n"
}
var unreleasedReg = regexp.MustCompile(`(?ms)^## \[Unreleased\]\(.*?\n+(## |\z)`)
func insertNewChangelog(orig string, section string) string {
orig = strings.TrimSpace(orig) + "\n"
orig = unreleasedReg.ReplaceAllString(orig, `$1`)
orig = strings.TrimSpace(orig) + "\n"
section = strings.TrimSpace(section) + "\n"
var bf bytes.Buffer
lineSnr := bufio.NewScanner(strings.NewReader(orig))
inserted := false
for lineSnr.Scan() {
line := lineSnr.Text()
if !inserted && strings.HasPrefix(line, "## ") {
bf.WriteString(section)
bf.WriteString("\n")
inserted = true
}
bf.WriteString(line)
bf.WriteString("\n")
}
if !inserted {
bf.WriteString("\n")
bf.WriteString(section)
}
return bf.String()
}