From 8ed149eb16f769b5f307e5d157308dfb0b32be2e Mon Sep 17 00:00:00 2001 From: Jaakko Tuosa Date: Mon, 10 Mar 2025 14:30:12 +0200 Subject: [PATCH] fix: ignore other prerelease tags when finding latest tag (#211) --- index.js | 2 +- lib/latest-semver-tag.js | 17 ++++++++++++++++- test/git.integration-test.js | 8 ++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index c05ff8d61..c1f208564 100755 --- a/index.js +++ b/index.js @@ -79,7 +79,7 @@ module.exports = async function standardVersion(argv) { if (pkg && pkg.version) { version = pkg.version; } else if (args.gitTagFallback) { - version = await latestSemverTag(args.tagPrefix); + version = await latestSemverTag(args); } else { throw new Error('no package file found'); } diff --git a/lib/latest-semver-tag.js b/lib/latest-semver-tag.js index 1230a0d4c..76a9ced39 100644 --- a/lib/latest-semver-tag.js +++ b/lib/latest-semver-tag.js @@ -1,13 +1,28 @@ const gitSemverTags = require('git-semver-tags'); const semver = require('semver'); -module.exports = function (tagPrefix = undefined) { +module.exports = function ({ tagPrefix, prerelease }) { return new Promise((resolve, reject) => { gitSemverTags({ tagPrefix }, function (err, tags) { if (err) return reject(err); else if (!tags.length) return resolve('1.0.0'); // Respect tagPrefix tags = tags.map((tag) => tag.replace(new RegExp('^' + tagPrefix), '')); + if (prerelease) { + // ignore any other prelease tags + tags = tags.filter((tag) => { + if (!semver.valid(tag)) return false; + if (!semver.prerelease(tag)) { + // include all non-prerelease versions + return true; + } + // check if the name of the prerelease matches the one we are looking for + if (semver.prerelease(tag)[0] === prerelease) { + return true; + } + return false; + }); + } // ensure that the largest semver tag is at the head. tags = tags.map((tag) => { return semver.clean(tag); diff --git a/test/git.integration-test.js b/test/git.integration-test.js index c10f1bf6d..33945868f 100644 --- a/test/git.integration-test.js +++ b/test/git.integration-test.js @@ -272,6 +272,14 @@ describe('git', function () { const output = shell.exec('git tag'); expect(output.stdout).toContain('v5.1.0'); }); + + it('uses only relevant prerelease tags', async function () { + shell.rm('package.json'); + mock({ bump: 'minor', tags: ['v1.1.0-b.0', 'v1.1.0-a.0', 'v1.0.0-b.0'] }); + await exec('--prerelease a'); + const output = shell.exec('git tag'); + expect(output.stdout).toContain('1.1.0-a.1'); + }); }); describe('Run ... to publish', function () {