Skip to content

Commit d2c0ce0

Browse files
authored
Added skip-on-empty flag to skip release when no commits (fregante#48)
1 parent 142a1c5 commit d2c0ce0

File tree

6 files changed

+77
-7
lines changed

6 files changed

+77
-7
lines changed

action.yml

+7
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ inputs:
4444
description: Set to true if you want to have prerelease instead release
4545
required: false
4646
default: 'false'
47+
skip-on-empty:
48+
description: Set to true to skip creating a release when all commits are excluded
49+
required: false
50+
default: 'false'
51+
outputs:
52+
skipped:
53+
description: Will be set to true if skip-on-empty is enabled and a release was not created, false otherwise
4754
runs:
4855
using: 'node12'
4956
main: 'distribution/index.js'

distribution/index.js

+17-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

generate-release-notes.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ async function generateReleaseNotes({
1111
commitTemplate = '- {hash} {title}',
1212
releaseTemplate = '{commits}\n\n{range}',
1313
dateFormat = 'short',
14-
sort = 'desc'
14+
sort = 'desc',
15+
skipOnEmpty = false
1516
}) {
1617
dateFormat = dateFormat.includes('%') ? 'format:' + dateFormat : dateFormat;
1718
// Get commits between computed range
@@ -39,6 +40,10 @@ async function generateReleaseNotes({
3940

4041
const commitEntries = [];
4142
if (commits.length === 0) {
43+
if (skipOnEmpty) {
44+
return;
45+
}
46+
4247
commitEntries.push('_Maintenance release_');
4348
} else {
4449
for (const {hash, date, title} of commits) {

generate-release-notes.test.js

+25
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,28 @@ test('generates changelog using reverse optios', async () => {
156156
[\`v3.0.0..v3.1.0\`](https://github.com/fregante/release-with-changelog/compare/v3.0.0..v3.1.0)
157157
`));
158158
});
159+
160+
test('generates changelog with all commits excluded', async () => {
161+
const output = await generateReleaseNotes({
162+
range,
163+
commitTemplate: '- {title}',
164+
releaseTemplate: '{commits}',
165+
exclude: 'a|e|i|o|u'
166+
});
167+
168+
expect(output).toEqual(dedent(`
169+
_Maintenance release_
170+
`));
171+
});
172+
173+
test('generates changelog with all commits excluded and skip-on-empty', async () => {
174+
const output = await generateReleaseNotes({
175+
range,
176+
commitTemplate: '- {title}',
177+
releaseTemplate: '{commits}',
178+
exclude: 'a|e|i|o|u',
179+
skipOnEmpty: true
180+
});
181+
182+
expect(output).toEqual(undefined);
183+
});

index.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ async function run() {
1616
const reverseSort = core.getInput('reverse-sort');
1717
const isDraft = core.getInput('draft') === 'true';
1818
const isPrerelease = core.getInput('prerelease') === 'true';
19+
const skipOnEmpty = core.getInput('skip-on-empty') === 'true';
1920

2021
// Fetch tags from remote
2122
await execFile('git', ['fetch', 'origin', '+refs/tags/*:refs/tags/*']);
@@ -45,18 +46,27 @@ async function run() {
4546

4647
core.info('Computed range: ' + range);
4748

49+
const releaseNotes = await generateReleaseNotes({range, exclude, commitTemplate, releaseTemplate, dateFormat, reverseSort, skipOnEmpty});
50+
51+
// Skip creating release if no commits
52+
// Explicit check to avoid matching an empty string https://github.com/fregante/release-with-changelog/pull/48#discussion_r719593452
53+
if (releaseNotes === undefined) {
54+
core.setOutput('skipped', true);
55+
return core.info('Skipped creating release for tag `' + pushedTag + '`');
56+
}
57+
4858
// Create a release with markdown content in body
4959
const octokit = getOctokit(core.getInput('token'));
5060
const createReleaseResponse = await octokit.repos.createRelease({
5161
repo,
5262
owner,
5363
name: releaseTitle.replace('{tag}', pushedTag),
5464
tag_name: pushedTag, // eslint-disable-line camelcase
55-
body: await generateReleaseNotes({range, exclude, commitTemplate, releaseTemplate, dateFormat, reverseSort}),
65+
body: releaseNotes,
5666
draft: isDraft,
5767
prerelease: isPrerelease
5868
});
59-
69+
core.setOutput('skipped', false);
6070
core.info('Created release `' + createReleaseResponse.data.id + '` for tag `' + pushedTag + '`');
6171
} catch (error) {
6272
core.setFailed(error.message);

readme.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,18 @@ Example: `true`
129129

130130
Set to `true` if you want to have prerelease instead release.
131131

132+
### skip-on-empty
133+
134+
Default: `false` <br>
135+
Example: `true`
136+
137+
Set to `true` if you want to skip creating the release when all commits are excluded.
138+
132139
## Outputs
133140

134-
None.
141+
### skipped
142+
143+
Will be set to `true` if skip-on-empty is enabled and a release was not created, `false` otherwise.
135144

136145
## Release notes for previous tags/releases
137146

0 commit comments

Comments
 (0)