Skip to content

Commit ab5b1fe

Browse files
authored
Add forcePrerelease option (#191)
* feat: add forcePrerelease option * add some tests
1 parent 3f2cbd9 commit ab5b1fe

File tree

4 files changed

+114
-0
lines changed

4 files changed

+114
-0
lines changed

schemas/config.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@
6565
"description": "Create the GitHub release as prerelease. Defaults to `false`.",
6666
"type": "boolean"
6767
},
68+
"forcePrerelease": {
69+
"description": "Always create a GitHub prerelease for every release. Defaults to `false`.",
70+
"type": "boolean"
71+
},
6872
"draft-pull-request": {
6973
"description": "Open the release pull request in draft mode. Defaults to `false`.",
7074
"type": "boolean"

src/bin/release-please.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ interface ManifestConfigArgs {
8686
interface ReleaseArgs {
8787
draft?: boolean;
8888
prerelease?: boolean;
89+
forcePrerelease?: boolean;
8990
releaseLabel?: string;
9091
prereleaseLabel?: string;
9192
snapshotLabel?: string;
@@ -580,6 +581,7 @@ const createReleaseCommand: yargs.CommandModule<{}, CreateReleaseArgs> = {
580581
packageName: argv.packageName,
581582
draft: argv.draft,
582583
prerelease: argv.prerelease,
584+
forcePrerelease: argv.forcePrerelease,
583585
includeComponentInTag: argv.monorepoTags,
584586
includeVInTag: argv.includeVInTags,
585587
},

src/manifest.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ export interface ReleaserConfig {
104104
skipGithubRelease?: boolean; // Note this should be renamed to skipGitHubRelease in next major release
105105
draft?: boolean;
106106
prerelease?: boolean;
107+
forcePrerelease?: boolean;
107108
draftPullRequest?: boolean;
108109
component?: string;
109110
packageName?: string;
@@ -159,6 +160,7 @@ interface ReleaserConfigJson {
159160
'skip-github-release'?: boolean;
160161
draft?: boolean;
161162
prerelease?: boolean;
163+
forcePrerelease?: boolean;
162164
'draft-pull-request'?: boolean;
163165
label?: string;
164166
'release-label'?: string;
@@ -200,6 +202,7 @@ export interface ManifestOptions {
200202
sequentialCalls?: boolean;
201203
draft?: boolean;
202204
prerelease?: boolean;
205+
forcePrerelease?: boolean;
203206
draftPullRequest?: boolean;
204207
groupPullRequestTitlePattern?: string;
205208
releaseSearchDepth?: number;
@@ -1301,6 +1304,7 @@ export class Manifest {
13011304
draft: config.draft ?? this.draft,
13021305
prerelease:
13031306
hasPrereleaseLabel ||
1307+
config.forcePrerelease ||
13041308
(config.prerelease && !!release.tag.version.preRelease),
13051309
});
13061310
}
@@ -2136,6 +2140,8 @@ function mergeReleaserConfig(
21362140
pathConfig.skipGithubRelease ?? defaultConfig.skipGithubRelease,
21372141
draft: pathConfig.draft ?? defaultConfig.draft,
21382142
prerelease: pathConfig.prerelease ?? defaultConfig.prerelease,
2143+
forcePrerelease:
2144+
pathConfig.forcePrerelease ?? defaultConfig.forcePrerelease,
21392145
component: pathConfig.component ?? defaultConfig.component,
21402146
packageName: pathConfig.packageName ?? defaultConfig.packageName,
21412147
versionFile: pathConfig.versionFile ?? defaultConfig.versionFile,

test/manifest.ts

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7213,6 +7213,108 @@ version = "3.0.0"
72137213
expect(releases[0].tag.toString()).to.eql('release-brancher-v1.3.1');
72147214
});
72157215

7216+
it('should build prerelease releases when forcePrerelease is true', async () => {
7217+
mockPullRequests(
7218+
github,
7219+
[],
7220+
[
7221+
{
7222+
headBranchName: 'release-please/branches/main',
7223+
baseBranchName: 'main',
7224+
number: 1234,
7225+
title: 'chore: release main',
7226+
body: pullRequestBody(
7227+
'release-notes/single-manifest-pre-major.txt'
7228+
),
7229+
labels: ['autorelease: pending'],
7230+
files: [''],
7231+
sha: 'abc123',
7232+
},
7233+
]
7234+
);
7235+
const getFileContentsStub = sandbox.stub(
7236+
github,
7237+
'getFileContentsOnBranch'
7238+
);
7239+
getFileContentsStub
7240+
.withArgs('package.json', 'main')
7241+
.resolves(
7242+
buildGitHubFileRaw(
7243+
JSON.stringify({name: '@google-cloud/release-brancher'})
7244+
)
7245+
);
7246+
const manifest = new Manifest(
7247+
github,
7248+
'main',
7249+
{
7250+
'.': {
7251+
releaseType: 'node',
7252+
prerelease: true,
7253+
forcePrerelease: true,
7254+
},
7255+
},
7256+
{
7257+
'.': Version.parse('0.1.0'),
7258+
}
7259+
);
7260+
const releases = await manifest.buildReleases();
7261+
expect(releases).lengthOf(1);
7262+
expect(releases[0].name).to.eql('release-brancher: v0.2.0');
7263+
expect(releases[0].draft).to.be.undefined;
7264+
expect(releases[0].prerelease).to.be.true;
7265+
expect(releases[0].tag.toString()).to.eql('release-brancher-v0.2.0');
7266+
});
7267+
7268+
it('should build prerelease releases from non-prerelease when forcePrerelease is true', async () => {
7269+
mockPullRequests(
7270+
github,
7271+
[],
7272+
[
7273+
{
7274+
headBranchName: 'release-please/branches/main',
7275+
baseBranchName: 'main',
7276+
number: 1234,
7277+
title: 'chore: release main',
7278+
body: pullRequestBody('release-notes/single-manifest.txt'),
7279+
labels: ['autorelease: pending'],
7280+
files: [''],
7281+
sha: 'abc123',
7282+
},
7283+
]
7284+
);
7285+
const getFileContentsStub = sandbox.stub(
7286+
github,
7287+
'getFileContentsOnBranch'
7288+
);
7289+
getFileContentsStub
7290+
.withArgs('package.json', 'main')
7291+
.resolves(
7292+
buildGitHubFileRaw(
7293+
JSON.stringify({name: '@google-cloud/release-brancher'})
7294+
)
7295+
);
7296+
const manifest = new Manifest(
7297+
github,
7298+
'main',
7299+
{
7300+
'.': {
7301+
releaseType: 'node',
7302+
prerelease: true,
7303+
forcePrerelease: true,
7304+
},
7305+
},
7306+
{
7307+
'.': Version.parse('1.3.0'),
7308+
}
7309+
);
7310+
const releases = await manifest.buildReleases();
7311+
expect(releases).lengthOf(1);
7312+
expect(releases[0].name).to.eql('release-brancher: v1.3.1');
7313+
expect(releases[0].draft).to.be.undefined;
7314+
expect(releases[0].prerelease).to.be.true;
7315+
expect(releases[0].tag.toString()).to.eql('release-brancher-v1.3.1');
7316+
});
7317+
72167318
it('should skip component in tag', async () => {
72177319
mockPullRequests(
72187320
github,

0 commit comments

Comments
 (0)