Skip to content

fix: ignore other prerelease tags when finding latest tag #213

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 9, 2025
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 index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}
Expand Down
17 changes: 16 additions & 1 deletion lib/latest-semver-tag.js
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
8 changes: 8 additions & 0 deletions test/git.integration-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 () {
Expand Down