Skip to content

Commit c3b4f1c

Browse files
authored
chore: fix version bump for Java (#655)
1 parent d12a218 commit c3b4f1c

File tree

3 files changed

+139
-6
lines changed

3 files changed

+139
-6
lines changed

scripts/release/__tests__/createReleasePR.test.ts

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
getSkippedCommitsText,
66
decideReleaseStrategy,
77
readVersions,
8+
getNextVersion,
89
} from '../createReleasePR';
910

1011
describe('createReleasePR', () => {
@@ -79,16 +80,19 @@ describe('createReleasePR', () => {
7980
javascript: {
8081
current: '0.0.1',
8182
releaseType: 'patch',
83+
next: getNextVersion('0.0.1', 'patch'),
8284
},
8385

8486
php: {
8587
current: '0.0.1',
8688
releaseType: 'patch',
89+
next: getNextVersion('0.0.1', 'patch'),
8790
},
8891

8992
java: {
9093
current: '0.0.1',
9194
releaseType: 'patch',
95+
next: getNextVersion('0.0.1', 'patch'),
9296
},
9397
})
9498
).toMatchInlineSnapshot(`
@@ -104,6 +108,7 @@ describe('createReleasePR', () => {
104108
javascript: {
105109
current: '0.0.1',
106110
releaseType: 'patch',
111+
next: getNextVersion('0.0.1', 'patch'),
107112
},
108113

109114
php: {
@@ -115,6 +120,7 @@ describe('createReleasePR', () => {
115120
java: {
116121
current: '0.0.1',
117122
releaseType: 'patch',
123+
next: getNextVersion('0.0.1', 'patch'),
118124
},
119125
})
120126
).toMatchInlineSnapshot(`
@@ -130,22 +136,25 @@ describe('createReleasePR', () => {
130136
javascript: {
131137
current: '0.0.1',
132138
releaseType: 'patch',
139+
next: getNextVersion('0.0.1', 'patch'),
133140
},
134141

135142
php: {
136143
current: '0.0.1',
137144
releaseType: 'minor',
145+
next: getNextVersion('0.0.1', 'minor'),
138146
},
139147

140148
java: {
141149
current: '0.0.1',
142-
releaseType: 'patch',
150+
releaseType: null,
143151
skipRelease: true,
152+
next: getNextVersion('0.0.1', null),
144153
},
145154
})
146155
).toMatchInlineSnapshot(`
147156
"- javascript: 0.0.1 -> **\`patch\` _(e.g. 0.0.2)_**
148-
- ~java: 0.0.1 -> **\`patch\` _(e.g. 0.0.2)_**~
157+
- ~java: 0.0.1 -> **\`null\` _(e.g. 0.0.1)_**~
149158
- No \`feat\` or \`fix\` commit, thus unchecked by default.
150159
- php: 0.0.1 -> **\`minor\` _(e.g. 0.1.0)_**"
151160
`);
@@ -178,6 +187,7 @@ describe('createReleasePR', () => {
178187
});
179188

180189
expect(versions.javascript.releaseType).toEqual('major');
190+
expect(versions.javascript.next).toEqual('1.0.0');
181191
});
182192

183193
it('bumps minor version for feat', () => {
@@ -205,6 +215,7 @@ describe('createReleasePR', () => {
205215
});
206216

207217
expect(versions.php.releaseType).toEqual('minor');
218+
expect(versions.php.next).toEqual('0.1.0');
208219
});
209220

210221
it('bumps patch version for fix', () => {
@@ -232,6 +243,7 @@ describe('createReleasePR', () => {
232243
});
233244

234245
expect(versions.java.releaseType).toEqual('patch');
246+
expect(versions.java.next).toEqual('0.0.2');
235247
});
236248

237249
it('marks noCommit for languages without any commit', () => {
@@ -261,6 +273,8 @@ describe('createReleasePR', () => {
261273
expect(versions.javascript.noCommit).toEqual(true);
262274
expect(versions.php.noCommit).toEqual(true);
263275
expect(versions.java.noCommit).toBeUndefined();
276+
expect(versions.java.releaseType).toEqual('patch');
277+
expect(versions.java.next).toEqual('0.0.2');
264278
});
265279

266280
it('releases every languages if a `specs` commit is present', () => {
@@ -289,10 +303,13 @@ describe('createReleasePR', () => {
289303

290304
expect(versions.javascript.noCommit).toBeUndefined();
291305
expect(versions.javascript.releaseType).toEqual('patch');
306+
expect(versions.javascript.next).toEqual('0.0.2');
292307
expect(versions.php.noCommit).toBeUndefined();
293308
expect(versions.php.releaseType).toEqual('patch');
309+
expect(versions.php.next).toEqual('0.0.2');
294310
expect(versions.java.noCommit).toBeUndefined();
295311
expect(versions.java.releaseType).toEqual('patch');
312+
expect(versions.java.next).toEqual('0.0.2');
296313
});
297314

298315
it('bumps for `specs` feat with only language `fix` commits', () => {
@@ -328,10 +345,13 @@ describe('createReleasePR', () => {
328345

329346
expect(versions.javascript.noCommit).toBeUndefined();
330347
expect(versions.javascript.releaseType).toEqual('minor');
348+
expect(versions.javascript.next).toEqual('0.1.0');
331349
expect(versions.php.noCommit).toBeUndefined();
332350
expect(versions.php.releaseType).toEqual('minor');
351+
expect(versions.php.next).toEqual('0.1.0');
333352
expect(versions.java.noCommit).toBeUndefined();
334353
expect(versions.java.releaseType).toEqual('minor');
354+
expect(versions.java.next).toEqual('0.1.0');
335355
});
336356

337357
it('marks skipRelease for patch upgrade without fix commit', () => {
@@ -361,6 +381,76 @@ describe('createReleasePR', () => {
361381
expect(versions.java.skipRelease).toBeUndefined();
362382
expect(versions.php.skipRelease).toBeUndefined();
363383
});
384+
385+
it('consider prerelease version and correctly bumps them', () => {
386+
const versions = decideReleaseStrategy({
387+
versions: {
388+
javascript: {
389+
current: '0.0.1-alpha',
390+
},
391+
java: {
392+
current: '0.0.1-beta',
393+
},
394+
php: {
395+
current: '0.0.1-algolia',
396+
},
397+
},
398+
commits: [
399+
{
400+
hash: 'b2501882',
401+
type: 'feat',
402+
scope: 'specs',
403+
message: 'add some descriptions',
404+
raw: 'b2501882 feat(specs): add some descriptions',
405+
},
406+
],
407+
});
408+
409+
expect(versions.javascript.noCommit).toBeUndefined();
410+
expect(versions.javascript.releaseType).toEqual('prerelease');
411+
expect(versions.javascript.next).toEqual('0.0.1-alpha.0');
412+
expect(versions.php.noCommit).toBeUndefined();
413+
expect(versions.php.releaseType).toEqual('prerelease');
414+
expect(versions.php.next).toEqual('0.0.1-algolia.0');
415+
expect(versions.java.noCommit).toBeUndefined();
416+
expect(versions.java.releaseType).toEqual('prerelease');
417+
expect(versions.java.next).toEqual('0.0.1-beta.0');
418+
});
419+
420+
it('bumps SNAPSHOT versions correctly', () => {
421+
const versions = decideReleaseStrategy({
422+
versions: {
423+
javascript: {
424+
current: '0.0.1-alpha',
425+
},
426+
java: {
427+
current: '0.0.1-SNAPSHOT',
428+
},
429+
php: {
430+
current: '0.0.1-beta',
431+
},
432+
},
433+
commits: [
434+
{
435+
hash: 'b2501882',
436+
type: 'feat',
437+
scope: 'specs',
438+
message: 'add some descriptions',
439+
raw: 'b2501882 feat(specs): add some descriptions',
440+
},
441+
],
442+
});
443+
444+
expect(versions.javascript.noCommit).toBeUndefined();
445+
expect(versions.javascript.releaseType).toEqual('prerelease');
446+
expect(versions.javascript.next).toEqual('0.0.1-alpha.0');
447+
expect(versions.php.noCommit).toBeUndefined();
448+
expect(versions.php.releaseType).toEqual('prerelease');
449+
expect(versions.php.next).toEqual('0.0.1-beta.0');
450+
expect(versions.java.noCommit).toBeUndefined();
451+
expect(versions.java.releaseType).toEqual('minor');
452+
expect(versions.java.next).toEqual('0.1.0-SNAPSHOT');
453+
});
364454
});
365455

366456
describe('getSkippedCommitsText', () => {

scripts/release/createReleasePR.ts

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ export function readVersions(): VersionsWithoutReleaseType {
4242

4343
export function getVersionChangesText(versions: Versions): string {
4444
return LANGUAGES.map((lang) => {
45-
const { current, releaseType, noCommit, skipRelease } = versions[lang];
45+
const { current, releaseType, noCommit, skipRelease, next } =
46+
versions[lang];
4647

4748
if (noCommit) {
4849
return `- ~${lang}: ${current} (${TEXT.noCommit})~`;
@@ -52,8 +53,6 @@ export function getVersionChangesText(versions: Versions): string {
5253
return `- ~${lang}: (${TEXT.currentVersionNotFound})~`;
5354
}
5455

55-
const next = semver.inc(current, releaseType!);
56-
5756
if (skipRelease) {
5857
return [
5958
`- ~${lang}: ${current} -> **\`${releaseType}\` _(e.g. ${next})_**~`,
@@ -149,6 +148,38 @@ export function parseCommit(commit: string): Commit {
149148
};
150149
}
151150

151+
/**
152+
* Returns the next version of the client.
153+
*/
154+
export function getNextVersion(
155+
current: string,
156+
releaseType: semver.ReleaseType | null
157+
): string {
158+
if (releaseType === null) {
159+
return current;
160+
}
161+
162+
let nextVersion: string | null = current;
163+
164+
// snapshots should not be bumped as prerelease
165+
if (!current.endsWith('-SNAPSHOT')) {
166+
nextVersion = semver.inc(current, releaseType);
167+
} else {
168+
nextVersion = `${semver.inc(
169+
current.replace('-SNAPSHOT', ''),
170+
releaseType
171+
)}-SNAPSHOT`;
172+
}
173+
174+
if (!nextVersion) {
175+
throw new Error(
176+
`Unable to bump version: '${current}' with release type: '${releaseType}'`
177+
);
178+
}
179+
180+
return nextVersion;
181+
}
182+
152183
/* eslint-disable no-param-reassign */
153184
export function decideReleaseStrategy({
154185
versions,
@@ -170,15 +201,23 @@ export function decideReleaseStrategy({
170201
...version,
171202
noCommit: true,
172203
releaseType: null,
204+
next: getNextVersion(currentVersion, null),
173205
};
174206
return versionsWithReleaseType;
175207
}
176208

177-
if (semver.prerelease(currentVersion)) {
209+
console.log(`Deciding next version bump for ${lang}.`);
210+
211+
// snapshots should not be bumped as prerelease
212+
if (
213+
semver.prerelease(currentVersion) &&
214+
!currentVersion.endsWith('-SNAPSHOT')
215+
) {
178216
// if version is like 0.1.2-beta.1, it increases to 0.1.2-beta.2, even if there's a breaking change.
179217
versionsWithReleaseType[lang] = {
180218
...version,
181219
releaseType: 'prerelease',
220+
next: getNextVersion(currentVersion, 'prerelease'),
182221
};
183222
return versionsWithReleaseType;
184223
}
@@ -191,6 +230,7 @@ export function decideReleaseStrategy({
191230
versionsWithReleaseType[lang] = {
192231
...version,
193232
releaseType: 'major',
233+
next: getNextVersion(currentVersion, 'major'),
194234
};
195235
return versionsWithReleaseType;
196236
}
@@ -200,6 +240,7 @@ export function decideReleaseStrategy({
200240
versionsWithReleaseType[lang] = {
201241
...version,
202242
releaseType: 'minor',
243+
next: getNextVersion(currentVersion, 'minor'),
203244
};
204245
return versionsWithReleaseType;
205246
}
@@ -208,6 +249,7 @@ export function decideReleaseStrategy({
208249
...version,
209250
releaseType: 'patch',
210251
...(commitTypes.has('fix') ? undefined : { skipRelease: true }),
252+
next: getNextVersion(currentVersion, 'patch'),
211253
};
212254
return versionsWithReleaseType;
213255
},

scripts/release/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { Language } from '../types';
55
export type Version = {
66
current: string;
77
releaseType: ReleaseType | null;
8+
next?: string;
89
skipRelease?: boolean;
910
noCommit?: boolean;
1011
};

0 commit comments

Comments
 (0)