Neale Pickett
·
2024-12-20
changelog.go
1// package changelog parses the most recent version from a CHANGELOG.md file.
2package changelog
3
4import (
5 "bufio"
6 "io"
7 "io/fs"
8 "strings"
9)
10
11// ReadVersionFS calls ReadVersion on the CHANGELOG.md file in fsys.
12func ReadVersionFS(fs fs.FS) (version string, date string) {
13 r, err := fs.Open("CHANGELOG.md")
14 if err != nil {
15 return "unknown-nochangelog", "???"
16 }
17 defer r.Close()
18
19 return ReadVersion(r)
20}
21
22// ReadVersion returns the topmost version listed in r.
23//
24// r must be a changelog in "keep a changelog" format:
25// https://keepachangelog.com/
26// Specifically, versions must appear as one of the two formats:
27//
28// - ## [Unreleased]
29// - ## [1.0.0] - 2017-06-20
30func ReadVersion(r io.Reader) (version string, date string) {
31 date = "???"
32
33 scanner := bufio.NewScanner(r)
34 for scanner.Scan() {
35 line := scanner.Text()
36 release := strings.TrimPrefix(line, "## [")
37 if release == line {
38 continue
39 }
40 v, d, found := strings.Cut(release, " - ")
41 version = strings.TrimSuffix(v, "]")
42 if found {
43 date = d
44 }
45 return version, date
46 }
47 return "unknown-changelog-noversion", date
48}