mirror of
https://github.com/shivammathur/setup-php.git
synced 2025-09-20 03:34:05 +07:00
Improve sorting in tools.getSemverVersion
This commit is contained in:
@ -61,7 +61,15 @@ jest.mock('../src/fetch', () => ({
|
|||||||
} else if (!token || token === 'valid_token') {
|
} else if (!token || token === 'valid_token') {
|
||||||
return {data: `[{"ref": "refs/tags/1.2.3", "url": "${url}"}]`};
|
return {data: `[{"ref": "refs/tags/1.2.3", "url": "${url}"}]`};
|
||||||
} else if (token === 'beta_token') {
|
} else if (token === 'beta_token') {
|
||||||
return {data: `[{"ref": "refs/tags/1.2.3-beta1", "url": "${url}"}]`};
|
return {data: `[{"ref": "refs/tags/1.2.3beta1", "url": "${url}"}]`};
|
||||||
|
} else if (token === 'rc_token') {
|
||||||
|
return {
|
||||||
|
data: `[{"ref":"refs/tags/3.0.0RC1"},{"ref":"refs/tags/3.0.0RC2"}]`
|
||||||
|
};
|
||||||
|
} else if (token === 'non_semver_tags') {
|
||||||
|
return {
|
||||||
|
data: `[{"ref":"refs/tags/release-2025-09-18"},{"ref":"refs/tags/release-2025-09-17"}]`
|
||||||
|
};
|
||||||
} else if (token === 'undefined_ref') {
|
} else if (token === 'undefined_ref') {
|
||||||
return {
|
return {
|
||||||
data: `[{"url":"${url}"},{"ref":"refs/tags/v1.2.4","url":"${url}"}]`
|
data: `[{"url":"${url}"},{"ref":"refs/tags/v1.2.4","url":"${url}"}]`
|
||||||
@ -97,13 +105,14 @@ jest.mock('../src/packagist', () => ({
|
|||||||
|
|
||||||
describe('Tools tests', () => {
|
describe('Tools tests', () => {
|
||||||
it.each`
|
it.each`
|
||||||
token | version
|
token | version
|
||||||
${'invalid_token'} | ${'1.2'}
|
${'invalid_token'} | ${'1.2'}
|
||||||
${'valid_token'} | ${'1.2.3'}
|
${'valid_token'} | ${'1.2.3'}
|
||||||
${'beta_token'} | ${'1.2.3-beta1'}
|
${'beta_token'} | ${'1.2.3beta1'}
|
||||||
${'undefined_ref'} | ${'1.2.4'}
|
${'undefined_ref'} | ${'1.2.4'}
|
||||||
${'multi_refs'} | ${'1.2.4'}
|
${'multi_refs'} | ${'1.2.4'}
|
||||||
${''} | ${'1.2.3'}
|
${'non_semver_tags'} | ${'release-2025-09-18'}
|
||||||
|
${''} | ${'1.2.3'}
|
||||||
`('checking getSemverVersion: $token', async ({token, version}) => {
|
`('checking getSemverVersion: $token', async ({token, version}) => {
|
||||||
process.env['GITHUB_TOKEN'] = token;
|
process.env['GITHUB_TOKEN'] = token;
|
||||||
expect(
|
expect(
|
||||||
@ -111,6 +120,26 @@ describe('Tools tests', () => {
|
|||||||
).toBe(version);
|
).toBe(version);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('checking getSemverVersion triggers ?? fallback via Map#get mock', async () => {
|
||||||
|
process.env['GITHUB_TOKEN'] = 'rc_token';
|
||||||
|
const spy = jest
|
||||||
|
.spyOn(Map.prototype as Map<string, string>, 'get')
|
||||||
|
.mockImplementation(function (
|
||||||
|
this: Map<string, string>,
|
||||||
|
key: string
|
||||||
|
): string | undefined {
|
||||||
|
if (key === '3.0.0-RC2') {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return Map.prototype.get.call(this, key);
|
||||||
|
});
|
||||||
|
const result = await tools.getSemverVersion(
|
||||||
|
getData({tool: 'tool', version: '3.0.0'})
|
||||||
|
);
|
||||||
|
expect(result).toBe('3.0.0-RC2');
|
||||||
|
spy.mockRestore();
|
||||||
|
});
|
||||||
|
|
||||||
it.each`
|
it.each`
|
||||||
tool | fetch_latest | version
|
tool | fetch_latest | version
|
||||||
${'tool'} | ${'true'} | ${'3.2.1'}
|
${'tool'} | ${'true'} | ${'3.2.1'}
|
||||||
|
2
dist/index.js
vendored
2
dist/index.js
vendored
File diff suppressed because one or more lines are too long
20
src/tools.ts
20
src/tools.ts
@ -21,6 +21,11 @@ interface IRef {
|
|||||||
* @param data
|
* @param data
|
||||||
*/
|
*/
|
||||||
export async function getSemverVersion(data: RS): Promise<string> {
|
export async function getSemverVersion(data: RS): Promise<string> {
|
||||||
|
const fixSemver = (t: string): string => {
|
||||||
|
if (/^\d+\.\d+\.\d+(-|$)/.test(t)) return t;
|
||||||
|
const m = t.match(/^(\d+\.\d+\.\d+)([A-Za-z]+[0-9A-Za-z.]+)$/);
|
||||||
|
return m ? `${m[1]}-${m[2]}` : t;
|
||||||
|
};
|
||||||
const search: string = data['version_prefix'] + data['version'];
|
const search: string = data['version_prefix'] + data['version'];
|
||||||
const url = `https://api.github.com/repos/${data['repository']}/git/matching-refs/tags%2F${search}.`;
|
const url = `https://api.github.com/repos/${data['repository']}/git/matching-refs/tags%2F${search}.`;
|
||||||
const github_token: string =
|
const github_token: string =
|
||||||
@ -35,7 +40,20 @@ export async function getSemverVersion(data: RS): Promise<string> {
|
|||||||
const tags = refs
|
const tags = refs
|
||||||
.map((i: IRef) => (i.ref?.split('/').pop() ?? '').replace(/^v(?=\d)/, ''))
|
.map((i: IRef) => (i.ref?.split('/').pop() ?? '').replace(/^v(?=\d)/, ''))
|
||||||
.filter((t: string) => t.length > 0);
|
.filter((t: string) => t.length > 0);
|
||||||
return tags.sort((a: string, b: string) => cv.compareVersions(b, a))[0];
|
const fixedToOriginal = new Map<string, string>();
|
||||||
|
const fixed = tags.map(t => {
|
||||||
|
const f = fixSemver(t);
|
||||||
|
fixedToOriginal.set(f, t);
|
||||||
|
return f;
|
||||||
|
});
|
||||||
|
fixed.sort((a, b) => {
|
||||||
|
try {
|
||||||
|
return cv.compareVersions(b, a);
|
||||||
|
} catch {
|
||||||
|
return b.localeCompare(a, 'en', {numeric: true, sensitivity: 'base'});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return fixedToOriginal.get(fixed[0]) ?? fixed[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user