Add "pre-release" mode (MINOR)

This commit is contained in:
Paul Hatcherian 2023-01-15 11:25:01 -06:00
parent 8b3b8f89c6
commit ddf8faf6a4
11 changed files with 93 additions and 5 deletions

View file

@ -26,4 +26,6 @@ export class ActionConfig {
public searchCommitBody: boolean = false;
/** The output method used to generate list of users, 'csv' or 'json'. Default is 'csv'. */
public userFormatType: string = "csv";
/** Prevents pre-v1.0.0 version from automatically incrementing the major version. If enabled, when the major version is 0, major releases will be treated as minor and minor as patch. Note that the versionType output is unchanged. */
public enablePrereleaseMode: boolean = false;
}

View file

@ -836,4 +836,34 @@ test('Prerelease tags are ignored on current commit', async () => {
await validate('1.1.0+3');
repo.makeCommit(`Commit ${i++}`);
await validate('1.1.0+4');
}, 15000);
test('Pre-release mode does not update major version if major version is 0', async () => {
const repo = createTestRepo({ tagPrefix: '', versionFormat: "${major}.${minor}.${patch}", enablePrereleaseMode: true });
repo.makeCommit('Initial Commit');
expect(( await repo.runAction()).formattedVersion).toBe('0.0.1');
repo.makeCommit('Second Commit (MINOR)');
expect(( await repo.runAction()).formattedVersion).toBe('0.0.1');
repo.makeCommit('Third Commit (MAJOR)');
expect(( await repo.runAction()).formattedVersion).toBe('0.1.0');
repo.exec('git tag 0.1.0');
repo.makeCommit('Fourth Commit (MAJOR)');
expect(( await repo.runAction()).formattedVersion).toBe('0.2.0');
}, 15000);
test('Pre-release mode updates major version if major version is not 0', async () => {
const repo = createTestRepo({ tagPrefix: '', versionFormat: "${major}.${minor}.${patch}", enablePrereleaseMode: true });
repo.makeCommit('Initial Commit');
repo.exec('git tag 1.0.0');
repo.makeCommit('Second Commit');
expect(( await repo.runAction()).formattedVersion).toBe('1.0.1');
repo.makeCommit('Third Commit (MINOR)');
expect(( await repo.runAction()).formattedVersion).toBe('1.1.0');
repo.makeCommit('Fourth Commit (MAJOR)');
expect(( await repo.runAction()).formattedVersion).toBe('2.0.0');
repo.exec('git tag 2.0.0');
repo.makeCommit('Fifth Commit (MAJOR)');
expect(( await repo.runAction()).formattedVersion).toBe('3.0.0');
}, 15000);

View file

@ -48,7 +48,8 @@ export async function run() {
namespace: core.getInput('namespace'),
bumpEachCommit: core.getInput('bump_each_commit') === 'true',
searchCommitBody: core.getInput('search_commit_body') === 'true',
userFormatType: core.getInput('user_format_type')
userFormatType: core.getInput('user_format_type'),
enablePrereleaseMode: core.getInput('enable_prerelease_mode') === 'true',
};
if (config.versionFormat === '' && core.getInput('format') !== '') {

View file

@ -10,11 +10,13 @@ export class DefaultVersionClassifier implements VersionClassifier {
protected majorPattern: (commit: CommitInfo) => boolean;
protected minorPattern: (commit: CommitInfo) => boolean;
protected enablePrereleaseMode: boolean;
constructor(config: ActionConfig) {
const searchBody = config.searchCommitBody;
this.majorPattern = this.parsePattern(config.majorPattern, config.majorFlags, searchBody);
this.minorPattern = this.parsePattern(config.minorPattern, config.minorFlags, searchBody);
this.enablePrereleaseMode = config.enablePrereleaseMode;
}
protected parsePattern(pattern: string, flags: string, searchBody: boolean): (pattern: CommitInfo) => boolean {
@ -32,7 +34,21 @@ export class DefaultVersionClassifier implements VersionClassifier {
}
protected getNextVersion(current: ReleaseInformation, type: VersionType): ({ major: number, minor: number, patch: number }) {
if (this.enablePrereleaseMode && current.major === 0) {
switch (type) {
case VersionType.Major:
return { major: current.major, minor: current.minor + 1, patch: 0 };
case VersionType.Minor:
case VersionType.Patch:
return { major: current.major, minor: current.minor, patch: current.patch + 1 };
case VersionType.None:
return { major: current.major, minor: current.minor, patch: current.patch };
default:
throw new Error(`Unknown change type: ${type}`);
}
}
switch (type) {
case VersionType.Major:
return { major: current.major + 1, minor: 0, patch: 0 };