pupate

No description provided
git clone https://git.woozle.org/neale/pupate.git

pupate / pkg / changelog
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}