Skip to content

Commit 95a6568

Browse files
authored
fix: "prerelease" versioning strategy (#2516)
* fix(versioning-strategy): create a stable version if prerelease is false * docs: Explain how prerelease settings works together * PR feedback * chore(lint): fixing linting issue
1 parent cb47346 commit 95a6568

File tree

5 files changed

+117
-11
lines changed

5 files changed

+117
-11
lines changed

docs/customizing.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ version given a list of parsed commits.
4444
| `always-bump-minor` | Always bump minor version | |
4545
| `always-bump-major` | Always bump major version |
4646
| `service-pack` | Designed for Java backport fixes. Uses Maven's specification for service pack versions (e.g. 1.2.3-sp.1) |
47-
| `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) |
47+
| `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). |
4848

4949
### Adding additional versioning strategy types
5050

docs/manifest-releaser.md

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

202207
// Force the creation of a Git tag for the release. This is particularly

src/versioning-strategies/prerelease.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
interface PrereleaseVersioningStrategyOptions
2929
extends DefaultVersioningStrategyOptions {
3030
prereleaseType?: string;
31+
prerelease?: boolean;
3132
}
3233

3334
/**
@@ -176,10 +177,12 @@ class PrereleaseMajorVersionUpdate extends AbstractPrereleaseVersionUpdate {
176177
*/
177178
export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
178179
readonly prereleaseType?: string;
180+
readonly prerelease: boolean;
179181

180182
constructor(options: PrereleaseVersioningStrategyOptions = {}) {
181183
super(options);
182184
this.prereleaseType = options.prereleaseType;
185+
this.prerelease = options.prerelease === true;
183186
}
184187

185188
determineReleaseType(
@@ -207,19 +210,40 @@ export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
207210
}
208211
}
209212

213+
let bumpedVersionUpdater: VersionUpdater;
210214
if (breaking > 0) {
211215
if (version.isPreMajor && this.bumpMinorPreMajor) {
212-
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
216+
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
217+
this.prereleaseType
218+
);
213219
} else {
214-
return new PrereleaseMajorVersionUpdate(this.prereleaseType);
220+
bumpedVersionUpdater = new PrereleaseMajorVersionUpdate(
221+
this.prereleaseType
222+
);
215223
}
216224
} else if (features > 0) {
217225
if (version.isPreMajor && this.bumpPatchForMinorPreMajor) {
218-
return new PrereleasePatchVersionUpdate(this.prereleaseType);
226+
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
227+
this.prereleaseType
228+
);
219229
} else {
220-
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
230+
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
231+
this.prereleaseType
232+
);
221233
}
234+
} else {
235+
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
236+
this.prereleaseType
237+
);
238+
}
239+
if (!this.prerelease) {
240+
const bumpedVersion: Version = bumpedVersionUpdater.bump(version);
241+
return new CustomVersionUpdate(
242+
Version.parse(
243+
`${bumpedVersion.major}.${bumpedVersion.minor}.${bumpedVersion.patch}`
244+
).toString()
245+
);
222246
}
223-
return new PrereleasePatchVersionUpdate(this.prereleaseType);
247+
return bumpedVersionUpdater;
224248
}
225249
}

test/plugins/node-workspace.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ describe('NodeWorkspace plugin', () => {
353353
path: 'node1',
354354
packageName: '@here/pkgA',
355355
versioningStrategy: new PrereleaseVersioningStrategy({
356+
prerelease: true,
356357
prereleaseType: 'beta',
357358
}),
358359
}),
@@ -362,6 +363,7 @@ describe('NodeWorkspace plugin', () => {
362363
path: 'node2',
363364
packageName: '@here/pkgB',
364365
versioningStrategy: new PrereleaseVersioningStrategy({
366+
prerelease: true,
365367
prereleaseType: 'beta',
366368
}),
367369
}),
@@ -371,6 +373,7 @@ describe('NodeWorkspace plugin', () => {
371373
path: 'node3',
372374
packageName: '@here/pkgC',
373375
versioningStrategy: new PrereleaseVersioningStrategy({
376+
prerelease: true,
374377
prereleaseType: 'beta',
375378
}),
376379
}),
@@ -380,6 +383,7 @@ describe('NodeWorkspace plugin', () => {
380383
path: 'node4',
381384
packageName: '@here/pkgD',
382385
versioningStrategy: new PrereleaseVersioningStrategy({
386+
prerelease: true,
383387
prereleaseType: 'beta',
384388
}),
385389
}),
@@ -389,6 +393,7 @@ describe('NodeWorkspace plugin', () => {
389393
path: 'node5',
390394
packageName: '@here/pkgE',
391395
versioningStrategy: new PrereleaseVersioningStrategy({
396+
prerelease: true,
392397
prereleaseType: 'beta',
393398
}),
394399
}),

test/versioning-strategies/prerelease.ts

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,15 @@ describe('PrereleaseVersioningStrategy', () => {
6868
for (const old in expectedBumps) {
6969
const expected = expectedBumps[old];
7070
it(`can bump ${old} to ${expected}`, async () => {
71-
const strategy = new PrereleaseVersioningStrategy();
71+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
7272
const oldVersion = Version.parse(old);
7373
const newVersion = await strategy.bump(oldVersion, commits);
7474
expect(newVersion.toString()).to.equal(expected);
7575
});
7676
}
7777
it('can bump a minor pre major for breaking change', async () => {
7878
const strategy = new PrereleaseVersioningStrategy({
79+
prerelease: true,
7980
bumpMinorPreMajor: true,
8081
});
8182
const oldVersion = Version.parse('0.1.2');
@@ -109,6 +110,7 @@ describe('PrereleaseVersioningStrategy', () => {
109110
const expected = expectedBumps[old];
110111
it(`can bump ${old} to ${expected}`, async () => {
111112
const strategy = new PrereleaseVersioningStrategy({
113+
prerelease: true,
112114
prereleaseType: 'beta',
113115
});
114116
const oldVersion = Version.parse(old);
@@ -118,6 +120,7 @@ describe('PrereleaseVersioningStrategy', () => {
118120
}
119121
it('can bump a minor pre major for breaking change', async () => {
120122
const strategy = new PrereleaseVersioningStrategy({
123+
prerelease: true,
121124
bumpMinorPreMajor: true,
122125
prereleaseType: 'beta',
123126
});
@@ -126,6 +129,29 @@ describe('PrereleaseVersioningStrategy', () => {
126129
expect(newVersion.toString()).to.equal('0.2.0-beta');
127130
});
128131
});
132+
describe('without prerelease property', () => {
133+
const expectedBumps: Record<string, string> = {
134+
'1.2.3': '2.0.0',
135+
// beta01 indicates that there had to be a breaking change with prerelease=true.
136+
// e.g. coong from 0.1.0 -> feat! (prerelease=True) -> 1.0.0-beta01 -> prerelease=False -> 1.0.0
137+
'1.0.0-beta01': '1.0.0',
138+
'1.1.0-beta01': '2.0.0',
139+
'1.3.0-alpha': '2.0.0',
140+
'1.3.0-alpha.1': '2.0.0',
141+
};
142+
for (const old in expectedBumps) {
143+
const expected = expectedBumps[old];
144+
it(`can bump ${old} to ${expected}`, async () => {
145+
const strategy = new PrereleaseVersioningStrategy({
146+
prerelease: false,
147+
prereleaseType: 'beta',
148+
});
149+
const oldVersion = Version.parse(old);
150+
const newVersion = await strategy.bump(oldVersion, commits);
151+
expect(newVersion.toString()).to.equal(expected);
152+
});
153+
}
154+
});
129155
});
130156

131157
describe('with a feature', () => {
@@ -177,14 +203,15 @@ describe('PrereleaseVersioningStrategy', () => {
177203
for (const old in expectedBumps) {
178204
const expected = expectedBumps[old];
179205
it(`can bump ${old} to ${expected}`, async () => {
180-
const strategy = new PrereleaseVersioningStrategy();
206+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
181207
const oldVersion = Version.parse(old);
182208
const newVersion = await strategy.bump(oldVersion, commits);
183209
expect(newVersion.toString()).to.equal(expected);
184210
});
185211
}
186212
it('can bump a patch pre-major', async () => {
187213
const strategy = new PrereleaseVersioningStrategy({
214+
prerelease: true,
188215
bumpPatchForMinorPreMajor: true,
189216
});
190217
const oldVersion = Version.parse('0.1.2');
@@ -218,6 +245,7 @@ describe('PrereleaseVersioningStrategy', () => {
218245
const expected = expectedBumps[old];
219246
it(`can bump ${old} to ${expected}`, async () => {
220247
const strategy = new PrereleaseVersioningStrategy({
248+
prerelease: true,
221249
prereleaseType: 'beta',
222250
});
223251
const oldVersion = Version.parse(old);
@@ -227,6 +255,7 @@ describe('PrereleaseVersioningStrategy', () => {
227255
}
228256
it('can bump a patch pre-major', async () => {
229257
const strategy = new PrereleaseVersioningStrategy({
258+
prerelease: true,
230259
bumpPatchForMinorPreMajor: true,
231260
prereleaseType: 'beta',
232261
});
@@ -235,6 +264,27 @@ describe('PrereleaseVersioningStrategy', () => {
235264
expect(newVersion.toString()).to.equal('0.1.3-beta');
236265
});
237266
});
267+
describe('without prerelease property', () => {
268+
const expectedBumps: Record<string, string> = {
269+
'1.2.3': '1.3.0',
270+
'1.0.0-beta01': '1.0.0',
271+
'1.1.0-beta01': '1.1.0',
272+
'1.3.0-alpha': '1.3.0',
273+
'1.3.0-alpha.1': '1.3.0',
274+
};
275+
for (const old in expectedBumps) {
276+
const expected = expectedBumps[old];
277+
it(`can bump ${old} to ${expected}`, async () => {
278+
const strategy = new PrereleaseVersioningStrategy({
279+
prerelease: false,
280+
prereleaseType: 'beta',
281+
});
282+
const oldVersion = Version.parse(old);
283+
const newVersion = await strategy.bump(oldVersion, commits);
284+
expect(newVersion.toString()).to.equal(expected);
285+
});
286+
}
287+
});
238288
});
239289

240290
describe('with a fix', () => {
@@ -277,7 +327,7 @@ describe('PrereleaseVersioningStrategy', () => {
277327
for (const old in expectedBumps) {
278328
const expected = expectedBumps[old];
279329
it(`can bump ${old} to ${expected}`, async () => {
280-
const strategy = new PrereleaseVersioningStrategy();
330+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
281331
const oldVersion = Version.parse(old);
282332
const newVersion = await strategy.bump(oldVersion, commits);
283333
expect(newVersion.toString()).to.equal(expected);
@@ -307,6 +357,28 @@ describe('PrereleaseVersioningStrategy', () => {
307357
const expected = expectedBumps[old];
308358
it(`can bump ${old} to ${expected}`, async () => {
309359
const strategy = new PrereleaseVersioningStrategy({
360+
prerelease: true,
361+
prereleaseType: 'beta',
362+
});
363+
const oldVersion = Version.parse(old);
364+
const newVersion = await strategy.bump(oldVersion, commits);
365+
expect(newVersion.toString()).to.equal(expected);
366+
});
367+
}
368+
});
369+
describe('without prerelease property', () => {
370+
const expectedBumps: Record<string, string> = {
371+
'1.2.3': '1.2.4',
372+
'1.0.0-beta01': '1.0.0',
373+
'1.1.0-beta01': '1.1.0',
374+
'1.2.4-alpha': '1.2.4',
375+
'1.2.4-alpha.1': '1.2.4',
376+
};
377+
for (const old in expectedBumps) {
378+
const expected = expectedBumps[old];
379+
it(`can bump ${old} to ${expected}`, async () => {
380+
const strategy = new PrereleaseVersioningStrategy({
381+
prerelease: false,
310382
prereleaseType: 'beta',
311383
});
312384
const oldVersion = Version.parse(old);
@@ -354,7 +426,7 @@ describe('PrereleaseVersioningStrategy', () => {
354426
breaking: false,
355427
},
356428
];
357-
const strategy = new PrereleaseVersioningStrategy();
429+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
358430
const oldVersion = Version.parse('1.2.3');
359431
const newVersion = await strategy.bump(oldVersion, commits);
360432
expect(newVersion.toString()).to.equal('3.1.2');
@@ -406,7 +478,7 @@ describe('PrereleaseVersioningStrategy', () => {
406478
breaking: true,
407479
},
408480
];
409-
const strategy = new PrereleaseVersioningStrategy();
481+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
410482
const oldVersion = Version.parse('1.2.3');
411483
const newVersion = await strategy.bump(oldVersion, commits);
412484
expect(newVersion.toString()).to.equal('3.1.2');

0 commit comments

Comments
 (0)