Skip to content

Commit 1b06a08

Browse files
committed
version spec: cover edge cases pointed out by review comments
1 parent 389daec commit 1b06a08

File tree

3 files changed

+52
-17
lines changed

3 files changed

+52
-17
lines changed

__tests__/setup-go.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,41 @@ describe('setup-go', () => {
710710
expect(im.makeSemver('1.13.1')).toBe('1.13.1');
711711
});
712712

713+
describe('normalizeVersionSpec', () => {
714+
it('converts Go-style prerelease to semver format', () => {
715+
expect(im.normalizeVersionSpec('1.14rc1')).toBe('1.14.0-rc.1');
716+
expect(im.normalizeVersionSpec('1.14beta1')).toBe('1.14.0-beta.1');
717+
expect(im.normalizeVersionSpec('1.21rc2')).toBe('1.21.0-rc.2');
718+
});
719+
720+
it('preserves range prefixes when converting', () => {
721+
expect(im.normalizeVersionSpec('^1.14rc1')).toBe('^1.14.0-rc.1');
722+
expect(im.normalizeVersionSpec('~1.14beta1')).toBe('~1.14.0-beta.1');
723+
expect(im.normalizeVersionSpec('>=1.14rc1')).toBe('>=1.14.0-rc.1');
724+
expect(im.normalizeVersionSpec('>1.14rc1')).toBe('>1.14.0-rc.1');
725+
expect(im.normalizeVersionSpec('<=1.14rc1')).toBe('<=1.14.0-rc.1');
726+
expect(im.normalizeVersionSpec('<1.14rc1')).toBe('<1.14.0-rc.1');
727+
expect(im.normalizeVersionSpec('=1.14rc1')).toBe('=1.14.0-rc.1');
728+
});
729+
730+
it('preserves versions without Go-style prerelease', () => {
731+
expect(im.normalizeVersionSpec('1.13')).toBe('1.13');
732+
expect(im.normalizeVersionSpec('1.13.7')).toBe('1.13.7');
733+
expect(im.normalizeVersionSpec('^1.13.6')).toBe('^1.13.6');
734+
expect(im.normalizeVersionSpec('>=1.13')).toBe('>=1.13');
735+
});
736+
737+
it('preserves already valid semver prerelease format', () => {
738+
expect(im.normalizeVersionSpec('1.14.0-rc.1')).toBe('1.14.0-rc.1');
739+
expect(im.normalizeVersionSpec('^1.14.0-beta.1')).toBe('^1.14.0-beta.1');
740+
});
741+
742+
it('does not match false positives like "traced"', () => {
743+
// "traced" contains "rc" but should not be treated as prerelease
744+
expect(im.normalizeVersionSpec('1.13traced')).toBe('1.13traced');
745+
});
746+
});
747+
713748
describe('check-latest flag', () => {
714749
it("use local version and don't check manifest if check-latest is not specified", async () => {
715750
os.platform = 'linux';

dist/setup/index.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94801,15 +94801,15 @@ function getVersionsDist(dlUrl) {
9480194801
// 1.13 => 1.13 (preserved for range matching)
9480294802
// 1.14rc1 => 1.14.0-rc.1
9480394803
// ^1.14rc1 => ^1.14.0-rc.1
94804-
// ~1.14beta1 => ~1.14.0-beta.1
94804+
// >=1.14beta1 => >=1.14.0-beta.1
9480594805
function normalizeVersionSpec(versionSpec) {
94806-
var _a;
94807-
const rangePrefix = ((_a = versionSpec.match(/^[~^]/)) === null || _a === void 0 ? void 0 : _a[0]) || '';
94808-
const version = versionSpec.replace(/^[~^]/, '');
94809-
// Only convert if it has Go-style prerelease (rc/beta without hyphen prefix)
94810-
const hasGoStylePrerelease = (version.includes('rc') || version.includes('beta')) &&
94811-
!version.includes('-rc.') &&
94812-
!version.includes('-beta.');
94806+
// Match semver range prefixes: ^, ~, >, >=, <, <=, =
94807+
const rangePrefixMatch = versionSpec.match(/^([~^]|[<>]=?|=)/);
94808+
const rangePrefix = (rangePrefixMatch === null || rangePrefixMatch === void 0 ? void 0 : rangePrefixMatch[0]) || '';
94809+
const version = versionSpec.slice(rangePrefix.length);
94810+
// Only convert if it has Go-style prerelease (e.g., rc1, beta1)
94811+
// Use regex to avoid false positives like "1.13traced"
94812+
const hasGoStylePrerelease = /(?:rc|beta)\d+/.test(version);
9481394813
if (!hasGoStylePrerelease) {
9481494814
return versionSpec;
9481594815
}

src/installer.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -467,16 +467,16 @@ export async function getVersionsDist(
467467
// 1.13 => 1.13 (preserved for range matching)
468468
// 1.14rc1 => 1.14.0-rc.1
469469
// ^1.14rc1 => ^1.14.0-rc.1
470-
// ~1.14beta1 => ~1.14.0-beta.1
470+
// >=1.14beta1 => >=1.14.0-beta.1
471471
export function normalizeVersionSpec(versionSpec: string): string {
472-
const rangePrefix = versionSpec.match(/^[~^]/)?.[0] || '';
473-
const version = versionSpec.replace(/^[~^]/, '');
474-
475-
// Only convert if it has Go-style prerelease (rc/beta without hyphen prefix)
476-
const hasGoStylePrerelease =
477-
(version.includes('rc') || version.includes('beta')) &&
478-
!version.includes('-rc.') &&
479-
!version.includes('-beta.');
472+
// Match semver range prefixes: ^, ~, >, >=, <, <=, =
473+
const rangePrefixMatch = versionSpec.match(/^([~^]|[<>]=?|=)/);
474+
const rangePrefix = rangePrefixMatch?.[0] || '';
475+
const version = versionSpec.slice(rangePrefix.length);
476+
477+
// Only convert if it has Go-style prerelease (e.g., rc1, beta1)
478+
// Use regex to avoid false positives like "1.13traced"
479+
const hasGoStylePrerelease = /(?:rc|beta)\d+/.test(version);
480480

481481
if (!hasGoStylePrerelease) {
482482
return versionSpec;

0 commit comments

Comments
 (0)