From e4229f9c6805c11984e383c48a43c235876886f3 Mon Sep 17 00:00:00 2001 From: Tijmen van de Meent Date: Wed, 28 Jun 2023 23:38:35 +0200 Subject: [PATCH] fix: get correct version if prerelease branch shares version with ... (#2416) --- lib/get-last-release.js | 6 +++++- test/get-last-release.test.js | 37 +++++++++++++++++++++++++++++++++++ test/get-next-version.test.js | 21 ++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/get-last-release.js b/lib/get-last-release.js index 3c27eb221f..d329c970e0 100644 --- a/lib/get-last-release.js +++ b/lib/get-last-release.js @@ -30,7 +30,11 @@ export default ({ branch, options: { tagFormat } }, { before } = {}) => { const [{ version, gitTag, channels } = {}] = branch.tags .filter( (tag) => - ((branch.type === "prerelease" && tag.channels.some((channel) => isSameChannel(branch.channel, channel))) || + ((branch.type === "prerelease" && + tag.channels.some((channel) => isSameChannel(branch.channel, channel)) && + semver + .parse(tag.version) + .prerelease.includes(branch.prerelease === true ? branch.name : branch.prerelease)) || !semver.prerelease(tag.version)) && (isUndefined(before) || semver.lt(tag.version, before)) ) diff --git a/test/get-last-release.test.js b/test/get-last-release.test.js index 1ca0611ff2..06dcfb6db9 100644 --- a/test/get-last-release.test.js +++ b/test/get-last-release.test.js @@ -43,6 +43,43 @@ test("Get the highest prerelease valid tag, ignoring other tags from other prere }); }); +test("Get the correct prerelease tag, when other prereleases share the same git HEAD", (t) => { + const testConfig = { + branch: { + name: "alpha", + prerelease: "alpha", + channel: "alpha", + tags: [ + { version: "1.0.0-beta.1", gitTag: "v1.0.0-beta.1", gitHead: "v1.0.0-beta.1", channels: ["beta"] }, + { version: "1.0.0-beta.2", gitTag: "v1.0.0-beta.2", gitHead: "v1.0.0-alpha.1", channels: ["alpha", "beta"] }, + { version: "1.0.0-alpha.1", gitTag: "v1.0.0-alpha.1", gitHead: "v1.0.0-alpha.1", channels: ["alpha", "beta"] }, + ], + type: "prerelease", + }, + options: { tagFormat: `v\${version}`, debug: true }, + }; + const firstResult = getLastRelease(testConfig); + + t.deepEqual(firstResult, { + version: "1.0.0-alpha.1", + gitTag: "v1.0.0-alpha.1", + name: "v1.0.0-alpha.1", + gitHead: "v1.0.0-alpha.1", + channels: ["alpha", "beta"], + }); + + testConfig.branch.prerelease = true; + const secondResult = getLastRelease(testConfig); + + t.deepEqual(secondResult, { + version: "1.0.0-alpha.1", + gitTag: "v1.0.0-alpha.1", + name: "v1.0.0-alpha.1", + gitHead: "v1.0.0-alpha.1", + channels: ["alpha", "beta"], + }); +}); + test("Return empty object if no valid tag is found", (t) => { const result = getLastRelease({ branch: { diff --git a/test/get-next-version.test.js b/test/get-next-version.test.js index 435b3b3ff4..a50526c783 100644 --- a/test/get-next-version.test.js +++ b/test/get-next-version.test.js @@ -275,3 +275,24 @@ test("Increase version for release on prerelease branch when there is no regular "1.0.0-beta.2" ); }); + +test("Increase patch when previous version shares HEAD with other releases", (t) => { + t.is( + getNextVersion({ + branch: { + name: "alpha", + type: "prerelease", + prerelease: "alpha", + tags: [ + { gitTag: "v1.0.0-beta.1", version: "1.0.0-beta.1", channels: ["beta"] }, + { gitTag: "v1.0.0-beta.2", version: "1.0.0-beta.2", channels: ["alpha", "beta"] }, + { gitTag: "v1.0.0-alpha.1", version: "1.0.0-alpha.1", channels: ["alpha", "beta"] }, + ], + }, + nextRelease: { type: "patch", channel: "alpha" }, + lastRelease: { version: "v1.0.0-alpha.1", channels: ["alpha", "beta"] }, + logger: t.context.logger, + }), + "1.0.0-alpha.2" + ); +});