Skip to content

Commit 3ab89f7

Browse files
committed
Add options to specify header level and version prefix
1 parent 4a5a562 commit 3ab89f7

File tree

3 files changed

+66
-9
lines changed

3 files changed

+66
-9
lines changed

README.md

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ This GitHub Action extracts release notes from a [Keep a Changelog](https://keep
1717

1818
### Inputs
1919

20-
| Input | Description |
21-
|-----------------------------------|---------------------------------------------------------------|
22-
| `changelog_file` _(optional)_ | The input path of the changelog file. Default: `CHANGELOG.md` |
23-
| `release_notes_file` _(optional)_ | The output path of the (optional) release notes file. |
20+
| Input | Description |
21+
| --------------------------------- | ----------------------------------------------------------------------------------------------------- |
22+
| `changelog_file` _(optional)_ | The input path of the changelog file. Default: `CHANGELOG.md` |
23+
| `release_notes_file` _(optional)_ | The output path of the (optional) release notes file. |
24+
| `version_prefix` _(optional)_ | A prefix before the version number in the changelog header tag, e.g. `version` as in [version x.y.z]. |
25+
| `header_level` _(optional)_ | The header level where the version description is expected. Default: `2` |
2426

2527
### Outputs
2628

@@ -76,6 +78,38 @@ jobs:
7678
changelog_file: MY_CHANGELOG.md
7779
```
7880

81+
### Change expected version header level to H3
82+
83+
```yaml
84+
jobs:
85+
build:
86+
runs-on: ubuntu-latest
87+
steps:
88+
- name: Checkout
89+
uses: actions/checkout@v3
90+
- name: Extract release notes
91+
id: extract-release-notes
92+
uses: ffurrer2/extract-release-notes@v1
93+
with:
94+
header_level: 3
95+
```
96+
97+
### Accept CHANGELOG.md files with [Version x.y.z] titles
98+
99+
```yaml
100+
jobs:
101+
build:
102+
runs-on: ubuntu-latest
103+
steps:
104+
- name: Checkout
105+
uses: actions/checkout@v3
106+
- name: Extract release notes
107+
id: extract-release-notes
108+
uses: ffurrer2/extract-release-notes@v1
109+
with:
110+
version_prefix: Version
111+
```
112+
79113
### Create a release notes file
80114

81115
```yaml

action.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ inputs:
1717
description: '`true` to get release notes from the `[Unreleased]` section. `false` to get release notes for the latest release. Default: `false`'
1818
required: false
1919
default: 'false'
20+
version_prefix:
21+
description: 'A prefix before the version number in the changelog.md header tag, e.g. `version` as in [version x.y.z]. Default: ``'
22+
required: false
23+
default: ''
24+
header_level:
25+
description: 'The header level where the version description is expected. Default: `2`'
26+
required: false
27+
default: 2
2028
outputs:
2129
release_notes:
2230
description: 'The escaped release notes.'

src/index.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,41 @@ async function main() {
2020
const prerelease = core.getInput('prerelease')
2121
core.debug(`prerelease = '${prerelease}'`)
2222

23-
const releaseNotes = await extractReleaseNotes(changelogFile, prerelease)
23+
const versionPrefix = core.getInput('version_prefix')
24+
core.debug(`version-prefix = '${versionPrefix}'`)
25+
26+
const headerLevel = parseInt(core.getInput('header_level'))
27+
core.debug(`header_level = '${headerLevel}'`)
28+
29+
const releaseNotes = await extractReleaseNotes(changelogFile, prerelease, versionPrefix, headerLevel)
2430
core.debug(`release-notes = '${releaseNotes}'`)
2531

2632
writeReleaseNotesFile(releaseNotesFile, releaseNotes)
2733

2834
core.setOutput("release_notes", releaseNotes)
2935
}
3036

31-
async function extractReleaseNotes(changelogFile, prerelease) {
37+
async function extractReleaseNotes(changelogFile, prerelease, versionPrefix, headerLevel) {
3238
const fileStream = fs.createReadStream(changelogFile, {encoding: encoding})
3339
const rl = readline.createInterface({
3440
input: fileStream
3541
})
3642
const lines = []
3743
let inside_release = false
44+
const header_level = (Number.isInteger(headerLevel) && (headerLevel > 0) && (headerLevel < 7)) ? headerLevel : 2
45+
const level_match_regex = "^#{" + header_level + "}\\s+"
46+
const levelup_match_regex = (header_level > 1) ? "^#{1," + (header_level - 1) + "}\\s+" : level_match_regex
47+
const version_match_regex = "\\[" + versionPrefix + "\\s*[0-9]"
48+
const unreleases_match_regex = "\\[Unreleased\\]"
49+
core.debug(`version_match_regex: '${version_match_regex}'`)
50+
core.debug(`unrelease_match_regex: '${unreleases_match_regex}'`)
3851
for await (const line of rl) {
39-
const start_of_release = (!!line.match("^#+ \\[[0-9]") || (prerelease === 'true' && !!line.match("^#+ \\[Unreleased\\]")))
52+
let header_match = (!!line.match(level_match_regex))
53+
let headerup_match = (!!line.match(levelup_match_regex))
54+
let start_of_release = (!!line.match(level_match_regex + version_match_regex) || (prerelease === 'true' && !!line.match(level_match_regex + unreleases_match_regex)))
4055
if (inside_release) {
41-
if (start_of_release) {
42-
core.debug(`next version found: '${line}'`)
56+
if (header_match || headerup_match) {
57+
core.debug(`end of version block: '${line}'`)
4358
break
4459
} else {
4560
lines.push(line)

0 commit comments

Comments
 (0)