Skip to content

Commit

Permalink
Add forcePrerelease option (#191)
Browse files Browse the repository at this point in the history
* feat: add forcePrerelease option

* add some tests
  • Loading branch information
dackerman authored Jan 28, 2025
1 parent 3f2cbd9 commit ab5b1fe
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 0 deletions.
4 changes: 4 additions & 0 deletions schemas/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@
"description": "Create the GitHub release as prerelease. Defaults to `false`.",
"type": "boolean"
},
"forcePrerelease": {
"description": "Always create a GitHub prerelease for every release. Defaults to `false`.",
"type": "boolean"
},
"draft-pull-request": {
"description": "Open the release pull request in draft mode. Defaults to `false`.",
"type": "boolean"
Expand Down
2 changes: 2 additions & 0 deletions src/bin/release-please.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ interface ManifestConfigArgs {
interface ReleaseArgs {
draft?: boolean;
prerelease?: boolean;
forcePrerelease?: boolean;
releaseLabel?: string;
prereleaseLabel?: string;
snapshotLabel?: string;
Expand Down Expand Up @@ -580,6 +581,7 @@ const createReleaseCommand: yargs.CommandModule<{}, CreateReleaseArgs> = {
packageName: argv.packageName,
draft: argv.draft,
prerelease: argv.prerelease,
forcePrerelease: argv.forcePrerelease,
includeComponentInTag: argv.monorepoTags,
includeVInTag: argv.includeVInTags,
},
Expand Down
6 changes: 6 additions & 0 deletions src/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ export interface ReleaserConfig {
skipGithubRelease?: boolean; // Note this should be renamed to skipGitHubRelease in next major release
draft?: boolean;
prerelease?: boolean;
forcePrerelease?: boolean;
draftPullRequest?: boolean;
component?: string;
packageName?: string;
Expand Down Expand Up @@ -159,6 +160,7 @@ interface ReleaserConfigJson {
'skip-github-release'?: boolean;
draft?: boolean;
prerelease?: boolean;
forcePrerelease?: boolean;
'draft-pull-request'?: boolean;
label?: string;
'release-label'?: string;
Expand Down Expand Up @@ -200,6 +202,7 @@ export interface ManifestOptions {
sequentialCalls?: boolean;
draft?: boolean;
prerelease?: boolean;
forcePrerelease?: boolean;
draftPullRequest?: boolean;
groupPullRequestTitlePattern?: string;
releaseSearchDepth?: number;
Expand Down Expand Up @@ -1301,6 +1304,7 @@ export class Manifest {
draft: config.draft ?? this.draft,
prerelease:
hasPrereleaseLabel ||
config.forcePrerelease ||
(config.prerelease && !!release.tag.version.preRelease),
});
}
Expand Down Expand Up @@ -2136,6 +2140,8 @@ function mergeReleaserConfig(
pathConfig.skipGithubRelease ?? defaultConfig.skipGithubRelease,
draft: pathConfig.draft ?? defaultConfig.draft,
prerelease: pathConfig.prerelease ?? defaultConfig.prerelease,
forcePrerelease:
pathConfig.forcePrerelease ?? defaultConfig.forcePrerelease,
component: pathConfig.component ?? defaultConfig.component,
packageName: pathConfig.packageName ?? defaultConfig.packageName,
versionFile: pathConfig.versionFile ?? defaultConfig.versionFile,
Expand Down
102 changes: 102 additions & 0 deletions test/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7213,6 +7213,108 @@ version = "3.0.0"
expect(releases[0].tag.toString()).to.eql('release-brancher-v1.3.1');
});

it('should build prerelease releases when forcePrerelease is true', async () => {
mockPullRequests(
github,
[],
[
{
headBranchName: 'release-please/branches/main',
baseBranchName: 'main',
number: 1234,
title: 'chore: release main',
body: pullRequestBody(
'release-notes/single-manifest-pre-major.txt'
),
labels: ['autorelease: pending'],
files: [''],
sha: 'abc123',
},
]
);
const getFileContentsStub = sandbox.stub(
github,
'getFileContentsOnBranch'
);
getFileContentsStub
.withArgs('package.json', 'main')
.resolves(
buildGitHubFileRaw(
JSON.stringify({name: '@google-cloud/release-brancher'})
)
);
const manifest = new Manifest(
github,
'main',
{
'.': {
releaseType: 'node',
prerelease: true,
forcePrerelease: true,
},
},
{
'.': Version.parse('0.1.0'),
}
);
const releases = await manifest.buildReleases();
expect(releases).lengthOf(1);
expect(releases[0].name).to.eql('release-brancher: v0.2.0');
expect(releases[0].draft).to.be.undefined;
expect(releases[0].prerelease).to.be.true;
expect(releases[0].tag.toString()).to.eql('release-brancher-v0.2.0');
});

it('should build prerelease releases from non-prerelease when forcePrerelease is true', async () => {
mockPullRequests(
github,
[],
[
{
headBranchName: 'release-please/branches/main',
baseBranchName: 'main',
number: 1234,
title: 'chore: release main',
body: pullRequestBody('release-notes/single-manifest.txt'),
labels: ['autorelease: pending'],
files: [''],
sha: 'abc123',
},
]
);
const getFileContentsStub = sandbox.stub(
github,
'getFileContentsOnBranch'
);
getFileContentsStub
.withArgs('package.json', 'main')
.resolves(
buildGitHubFileRaw(
JSON.stringify({name: '@google-cloud/release-brancher'})
)
);
const manifest = new Manifest(
github,
'main',
{
'.': {
releaseType: 'node',
prerelease: true,
forcePrerelease: true,
},
},
{
'.': Version.parse('1.3.0'),
}
);
const releases = await manifest.buildReleases();
expect(releases).lengthOf(1);
expect(releases[0].name).to.eql('release-brancher: v1.3.1');
expect(releases[0].draft).to.be.undefined;
expect(releases[0].prerelease).to.be.true;
expect(releases[0].tag.toString()).to.eql('release-brancher-v1.3.1');
});

it('should skip component in tag', async () => {
mockPullRequests(
github,
Expand Down

0 comments on commit ab5b1fe

Please sign in to comment.