Skip to content

Add options to specify header level and version prefix #336

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -143,3 +143,39 @@ jobs:
RELEASE_NOTES: ${{ steps.extract-release-notes-9.outputs.release_notes }}
run: |
diff RELEASE_NOTES.md test/testdata/expected/RELEASE_NOTES_3.md
- name: Run action
id: extract-release-notes-10
uses: ./
with:
changelog_file: test/testdata/CHANGELOG_5.md
version_prefix: v
- name: Assert that release_notes contains expected content
shell: bash
env:
RELEASE_NOTES: ${{ steps.extract-release-notes-10.outputs.release_notes }}
run: |
diff <(echo -n "${RELEASE_NOTES}") test/testdata/expected/RELEASE_NOTES_1.md
- name: Run action
id: extract-release-notes-11
uses: ./
with:
changelog_file: test/testdata/CHANGELOG_6.md
header_level: 3
- name: Assert that release_notes contains expected content
shell: bash
env:
RELEASE_NOTES: ${{ steps.extract-release-notes-11.outputs.release_notes }}
run: |
diff <(echo -n "${RELEASE_NOTES}") test/testdata/expected/RELEASE_NOTES_6.md
- name: Run action
id: extract-release-notes-12
uses: ./
with:
changelog_file: test/testdata/CHANGELOG_7.md
version_prefix: version
- name: Assert that release_notes contains expected content
shell: bash
env:
RELEASE_NOTES: ${{ steps.extract-release-notes-12.outputs.release_notes }}
run: |
diff <(echo -n "${RELEASE_NOTES}") test/testdata/expected/RELEASE_NOTES_1.md
24 changes: 24 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,18 @@ jobs:
- changelog_file: CHANGELOG_4.md
expected_release_notes_file: RELEASE_NOTES_4.md
prerelease: true
- changelog_file: CHANGELOG_5.md
expected_release_notes_file: RELEASE_NOTES_1.md
prerelease: false
version_prefix: v
- changelog_file: CHANGELOG_6.md
expected_release_notes_file: RELEASE_NOTES_6.md
prerelease: false
header_level: 3
- changelog_file: CHANGELOG_7.md
expected_release_notes_file: RELEASE_NOTES_1.md
prerelease: false
version_prefix: version
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
Expand Down Expand Up @@ -137,6 +149,18 @@ jobs:
- changelog_file: CHANGELOG_4.md
expected_release_notes_file: RELEASE_NOTES_4.md
prerelease: true
- changelog_file: CHANGELOG_5.md
expected_release_notes_file: RELEASE_NOTES_1.md
prerelease: false
version_prefix: v
- changelog_file: CHANGELOG_6.md
expected_release_notes_file: RELEASE_NOTES_6.md
prerelease: false
header_level: 3
- changelog_file: CHANGELOG_7.md
expected_release_notes_file: RELEASE_NOTES_1.md
prerelease: false
version_prefix: version
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

### Added

- Allow for version number prefix in the changelog header tag, e.g. `version` as in [version x.y.z]
- Allow for changing the header level (default 2) where the version description is expected
- Allow for omitting enclosing brackets of version number

### Changed

### Deprecated
Expand Down
42 changes: 38 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ This GitHub Action extracts release notes from a [Keep a Changelog](https://keep

### Inputs

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

### Outputs

Expand Down Expand Up @@ -78,6 +80,38 @@ jobs:
changelog_file: MY_CHANGELOG.md
```

### Change expected version header level to H3

```yaml
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Extract release notes
id: extract-release-notes
uses: ffurrer2/extract-release-notes@v2
with:
header_level: 3
```

### Accept CHANGELOG.md files with [Version x.y.z] titles

```yaml
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Extract release notes
id: extract-release-notes
uses: ffurrer2/extract-release-notes@v2
with:
version_prefix: Version
```

### Create a release notes file

```yaml
Expand Down
8 changes: 8 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ inputs:
description: '`true` to get release notes from the `[Unreleased]` section. `false` to get release notes for the latest release. Default: `false`'
required: false
default: 'false'
version_prefix:
description: 'A prefix before the version number in the changelog.md header tag, e.g. `version` as in [version x.y.z]. Default: ``'
required: false
default: ''
header_level:
description: 'The header level where the version description is expected. Default: `2`'
required: false
default: 2
outputs:
release_notes:
description: 'The escaped release notes.'
Expand Down
29 changes: 24 additions & 5 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,41 @@ async function main() {
const prerelease = core.getInput('prerelease')
core.debug(`prerelease = '${prerelease}'`)

const releaseNotes = await extractReleaseNotes(changelogFile, prerelease)
const versionPrefix = core.getInput('version_prefix')
core.debug(`version-prefix = '${versionPrefix}'`)

const headerLevel = parseInt(core.getInput('header_level'))
core.debug(`header_level = '${headerLevel}'`)

const releaseNotes = await extractReleaseNotes(changelogFile, prerelease, versionPrefix, headerLevel)
core.debug(`release-notes = '${releaseNotes}'`)

writeReleaseNotesFile(releaseNotesFile, releaseNotes)

core.setOutput("release_notes", releaseNotes)
}

async function extractReleaseNotes(changelogFile, prerelease) {
async function extractReleaseNotes(changelogFile, prerelease, versionPrefix, headerLevel) {
const fileStream = fs.createReadStream(changelogFile, {encoding: encoding})
const rl = readline.createInterface({
input: fileStream
})
const lines = []
let inside_release = false
const header_level = (Number.isInteger(headerLevel) && (headerLevel > 0) && (headerLevel < 7)) ? +headerLevel : 2
const level_match_regex = "^#{" + header_level + "}\\s+"
const levelup_match_regex = (header_level > 1) ? "^#{1," + (header_level - 1) + "}\\s+" : level_match_regex
const version_match_regex = "\\[?" + escapeRegex(versionPrefix) + "\\s*[0-9]"
const unreleases_match_regex = "\\[?Unreleased\\]?"
core.debug(`version_match_regex: '${version_match_regex}'`)
core.debug(`unrelease_match_regex: '${unreleases_match_regex}'`)
for await (const line of rl) {
const start_of_release = (!!line.match("^#+ \\[[0-9]") || (prerelease === 'true' && !!line.match("^#+ \\[Unreleased\\]")))
let header_match = (!!line.match(level_match_regex))
let headerup_match = (!!line.match(levelup_match_regex))
let start_of_release = (!!line.match(level_match_regex + version_match_regex) || (prerelease === 'true' && !!line.match(level_match_regex + unreleases_match_regex)))
if (inside_release) {
if (start_of_release) {
core.debug(`next version found: '${line}'`)
if (header_match || headerup_match) {
core.debug(`end of version block: '${line}'`)
break
} else {
lines.push(line)
Expand Down Expand Up @@ -78,3 +93,7 @@ function writeReleaseNotesFile(releaseNotesFile, releaseNotes) {
})
}
}

function escapeRegex(string) {
return string.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&');
}
48 changes: 48 additions & 0 deletions test/testdata/CHANGELOG_5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!-- SPDX-License-Identifier: MIT -->

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

### Changed

### Deprecated

### Removed

### Fixed

### Security

## [v1.0.0] - 2024-05-15

### Added

- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

### Changed

- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

### Removed

- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

## [v0.1.0] - 2019-12-01

### Added

- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
52 changes: 52 additions & 0 deletions test/testdata/CHANGELOG_6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<!-- SPDX-License-Identifier: MIT -->

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## Version 1.0.x

### [Unreleased]

#### Added

#### Changed

#### Deprecated

#### Removed

#### Fixed

#### Security

### [1.0.0] - 2024-05-15

#### Added

- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

#### Changed

- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

#### Removed

- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

## Version 0.1.x

### [0.1.0] - 2019-12-01

#### Added

- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
48 changes: 48 additions & 0 deletions test/testdata/CHANGELOG_7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!-- SPDX-License-Identifier: MIT -->

# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## Unreleased

### Added

### Changed

### Deprecated

### Removed

### Fixed

### Security

## version 1.0 - 2024-05-21

### Added

- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

### Changed

- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

### Removed

- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

## version 0.1 - 2019-12-01

### Added

- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
16 changes: 16 additions & 0 deletions test/testdata/expected/RELEASE_NOTES_6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#### Added

- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
- Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

#### Changed

- At vero eos et accusam et justo duo dolores et ea rebum.
- Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

#### Removed

- At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Loading