Skip to content
Merged
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
2 changes: 1 addition & 1 deletion docs/customizing.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ version given a list of parsed commits.
| `always-bump-minor` | Always bump minor version | |
| `always-bump-major` | Always bump major version |
| `service-pack` | Designed for Java backport fixes. Uses Maven's specification for service pack versions (e.g. 1.2.3-sp.1) |
| `prerelease` | Bumping prerelease number (eg. 1.2.0-beta01 to 1.2.0-beta02) or if prerelease type is set, using that in the prerelease part (eg. 1.2.1 to 1.3.0-beta) |
| `prerelease` | Bumping prerelease number (eg. 1.2.0-beta01 to 1.2.0-beta02) or if prerelease type is set, using that in the prerelease part (eg. 1.2.1 to 1.3.0-beta). Works together with the "prerelease" settings from [manifest-releaser](/docs/manifest-releaser.md) (see for more infos) - A prerelease version number will only be created if the prerelease setting is set to `true`. Default: `false`. For more information, see [Manifest Driven release-please](manifest-releaser.md). |

### Adding additional versioning strategy types

Expand Down
5 changes: 5 additions & 0 deletions docs/manifest-releaser.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,11 @@ defaults (those are documented in comments)
// when `manifest-release` creates GitHub Releases per package, create
// those as "Prerelease" releases that have pre-major or prerelease versions.
// absence defaults to false and all versions are fully Published.
// Works together with the "prerelease" versioning strategy, which creates a
// prerelease-version (like 1.0.0-alpha.1) only if this setting is set to true.
// This allows to create prerelease-versions while working on pre-release branches -
// once the development is done and the branch gets merged to main/release-branch
// a full-release can be done.
"prerelease": true,

// Force the creation of a Git tag for the release. This is particularly
Expand Down
34 changes: 29 additions & 5 deletions src/versioning-strategies/prerelease.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
interface PrereleaseVersioningStrategyOptions
extends DefaultVersioningStrategyOptions {
prereleaseType?: string;
prerelease?: boolean;
}

/**
Expand Down Expand Up @@ -176,10 +177,12 @@ class PrereleaseMajorVersionUpdate extends AbstractPrereleaseVersionUpdate {
*/
export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
readonly prereleaseType?: string;
readonly prerelease: boolean;

constructor(options: PrereleaseVersioningStrategyOptions = {}) {
super(options);
this.prereleaseType = options.prereleaseType;
this.prerelease = options.prerelease === true;
}

determineReleaseType(
Expand Down Expand Up @@ -207,19 +210,40 @@ export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
}
}

let bumpedVersionUpdater: VersionUpdater;
if (breaking > 0) {
if (version.isPreMajor && this.bumpMinorPreMajor) {
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
this.prereleaseType
);
} else {
return new PrereleaseMajorVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleaseMajorVersionUpdate(
this.prereleaseType
);
}
} else if (features > 0) {
if (version.isPreMajor && this.bumpPatchForMinorPreMajor) {
return new PrereleasePatchVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
this.prereleaseType
);
} else {
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
this.prereleaseType
);
}
} else {
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
this.prereleaseType
);
}
if (!this.prerelease) {
const bumpedVersion: Version = bumpedVersionUpdater.bump(version);
return new CustomVersionUpdate(
Version.parse(
`${bumpedVersion.major}.${bumpedVersion.minor}.${bumpedVersion.patch}`
).toString()
);
}
return new PrereleasePatchVersionUpdate(this.prereleaseType);
return bumpedVersionUpdater;
}
}
5 changes: 5 additions & 0 deletions test/plugins/node-workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node1',
packageName: '@here/pkgA',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -362,6 +363,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node2',
packageName: '@here/pkgB',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -371,6 +373,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node3',
packageName: '@here/pkgC',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -380,6 +383,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node4',
packageName: '@here/pkgD',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -389,6 +393,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node5',
packageName: '@here/pkgE',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand Down
82 changes: 77 additions & 5 deletions test/versioning-strategies/prerelease.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,15 @@ describe('PrereleaseVersioningStrategy', () => {
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
it('can bump a minor pre major for breaking change', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpMinorPreMajor: true,
});
const oldVersion = Version.parse('0.1.2');
Expand Down Expand Up @@ -109,6 +110,7 @@ describe('PrereleaseVersioningStrategy', () => {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
Expand All @@ -118,6 +120,7 @@ describe('PrereleaseVersioningStrategy', () => {
}
it('can bump a minor pre major for breaking change', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpMinorPreMajor: true,
prereleaseType: 'beta',
});
Expand All @@ -126,6 +129,29 @@ describe('PrereleaseVersioningStrategy', () => {
expect(newVersion.toString()).to.equal('0.2.0-beta');
});
});
describe('without prerelease property', () => {
const expectedBumps: Record<string, string> = {
'1.2.3': '2.0.0',
// beta01 indicates that there had to be a breaking change with prerelease=true.
// e.g. coong from 0.1.0 -> feat! (prerelease=True) -> 1.0.0-beta01 -> prerelease=False -> 1.0.0
'1.0.0-beta01': '1.0.0',
'1.1.0-beta01': '2.0.0',
'1.3.0-alpha': '2.0.0',
'1.3.0-alpha.1': '2.0.0',
};
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: false,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
});
});

describe('with a feature', () => {
Expand Down Expand Up @@ -177,14 +203,15 @@ describe('PrereleaseVersioningStrategy', () => {
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
it('can bump a patch pre-major', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpPatchForMinorPreMajor: true,
});
const oldVersion = Version.parse('0.1.2');
Expand Down Expand Up @@ -218,6 +245,7 @@ describe('PrereleaseVersioningStrategy', () => {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
Expand All @@ -227,6 +255,7 @@ describe('PrereleaseVersioningStrategy', () => {
}
it('can bump a patch pre-major', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpPatchForMinorPreMajor: true,
prereleaseType: 'beta',
});
Expand All @@ -235,6 +264,27 @@ describe('PrereleaseVersioningStrategy', () => {
expect(newVersion.toString()).to.equal('0.1.3-beta');
});
});
describe('without prerelease property', () => {
const expectedBumps: Record<string, string> = {
'1.2.3': '1.3.0',
'1.0.0-beta01': '1.0.0',
'1.1.0-beta01': '1.1.0',
'1.3.0-alpha': '1.3.0',
'1.3.0-alpha.1': '1.3.0',
};
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: false,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
});
});

describe('with a fix', () => {
Expand Down Expand Up @@ -277,7 +327,7 @@ describe('PrereleaseVersioningStrategy', () => {
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
Expand Down Expand Up @@ -307,6 +357,28 @@ describe('PrereleaseVersioningStrategy', () => {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
});
describe('without prerelease property', () => {
const expectedBumps: Record<string, string> = {
'1.2.3': '1.2.4',
'1.0.0-beta01': '1.0.0',
'1.1.0-beta01': '1.1.0',
'1.2.4-alpha': '1.2.4',
'1.2.4-alpha.1': '1.2.4',
};
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: false,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
Expand Down Expand Up @@ -354,7 +426,7 @@ describe('PrereleaseVersioningStrategy', () => {
breaking: false,
},
];
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse('1.2.3');
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal('3.1.2');
Expand Down Expand Up @@ -406,7 +478,7 @@ describe('PrereleaseVersioningStrategy', () => {
breaking: true,
},
];
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse('1.2.3');
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal('3.1.2');
Expand Down
Loading