Skip to content
This repository was archived by the owner on Mar 25, 2025. It is now read-only.

Commit b9ab292

Browse files
authored
Merge pull request #1 from colesbury/quansight
Support free threaded Python versions like '3.13t'
2 parents 55aad42 + 079f76b commit b9ab292

File tree

3 files changed

+55
-6
lines changed

3 files changed

+55
-6
lines changed

dist/setup/index.js

+26-3
Original file line numberDiff line numberDiff line change
@@ -91038,9 +91038,15 @@ function useCpythonVersion(version, architecture, updateEnvironment, checkLatest
9103891038
return __awaiter(this, void 0, void 0, function* () {
9103991039
var _a;
9104091040
let manifest = null;
91041-
const desugaredVersionSpec = desugarDevVersion(version);
91042-
let semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec, allowPreReleases);
91041+
const [desugaredVersionSpec, freethreaded] = desugarFreeThreadedVersion(version);
91042+
const desugaredVersionSpec2 = desugarDevVersion(desugaredVersionSpec);
91043+
let semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec2, allowPreReleases);
9104391044
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
91045+
if (freethreaded) {
91046+
// Free threaded versions use an architecture suffix like `x64-freethreaded`
91047+
core.debug(`Using freethreaded version of ${semanticVersionSpec}`);
91048+
architecture += freethreaded;
91049+
}
9104491050
if (checkLatest) {
9104591051
manifest = yield installer.getManifest();
9104691052
const resolvedVersion = (_a = (yield installer.findReleaseFromManifest(semanticVersionSpec, architecture, manifest))) === null || _a === void 0 ? void 0 : _a.version;
@@ -91115,6 +91121,23 @@ function useCpythonVersion(version, architecture, updateEnvironment, checkLatest
9111591121
});
9111691122
}
9111791123
exports.useCpythonVersion = useCpythonVersion;
91124+
/* Identify freethreaded versions like, 3.13t, 3.13t-dev, 3.14.0a1t. Returns
91125+
* the version without the `t` and the architectures suffix, if freethreaded */
91126+
function desugarFreeThreadedVersion(versionSpec) {
91127+
const prereleaseVersion = /(\d+\.\d+\.\d+)(t)((?:a|b|rc)\d*)/g;
91128+
if (prereleaseVersion.test(versionSpec)) {
91129+
return [versionSpec.replace(prereleaseVersion, '$1$3'), '-freethreaded'];
91130+
}
91131+
const majorMinor = /^(\d+\.\d+)(t)$/;
91132+
if (majorMinor.test(versionSpec)) {
91133+
return [versionSpec.replace(majorMinor, '$1'), '-freethreaded'];
91134+
}
91135+
const devVersion = /^(\d+\.\d+)(t)(-dev)$/;
91136+
if (devVersion.test(versionSpec)) {
91137+
return [versionSpec.replace(devVersion, '$1$3'), '-freethreaded'];
91138+
}
91139+
return [versionSpec, ''];
91140+
}
9111891141
/** Convert versions like `3.8-dev` to a version like `~3.8.0-0`. */
9111991142
function desugarDevVersion(versionSpec) {
9112091143
const devVersion = /^(\d+)\.(\d+)-dev$/;
@@ -91629,7 +91652,7 @@ const httpm = __importStar(__nccwpck_require__(6255));
9162991652
const utils_1 = __nccwpck_require__(1314);
9163091653
const TOKEN = core.getInput('token');
9163191654
const AUTH = !TOKEN ? undefined : `token ${TOKEN}`;
91632-
const MANIFEST_REPO_OWNER = 'actions';
91655+
const MANIFEST_REPO_OWNER = 'Quansight-Labs';
9163391656
const MANIFEST_REPO_NAME = 'python-versions';
9163491657
const MANIFEST_REPO_BRANCH = 'main';
9163591658
exports.MANIFEST_URL = `https://raw.githubusercontent.com/${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}/${MANIFEST_REPO_BRANCH}/versions-manifest.json`;

src/find-python.ts

+28-2
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,21 @@ export async function useCpythonVersion(
3838
allowPreReleases: boolean
3939
): Promise<InstalledVersion> {
4040
let manifest: tc.IToolRelease[] | null = null;
41-
const desugaredVersionSpec = desugarDevVersion(version);
41+
const [desugaredVersionSpec, freethreaded] =
42+
desugarFreeThreadedVersion(version);
43+
const desugaredVersionSpec2 = desugarDevVersion(desugaredVersionSpec);
4244
let semanticVersionSpec = pythonVersionToSemantic(
43-
desugaredVersionSpec,
45+
desugaredVersionSpec2,
4446
allowPreReleases
4547
);
4648
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
4749

50+
if (freethreaded) {
51+
// Free threaded versions use an architecture suffix like `x64-freethreaded`
52+
core.debug(`Using freethreaded version of ${semanticVersionSpec}`);
53+
architecture += freethreaded;
54+
}
55+
4856
if (checkLatest) {
4957
manifest = await installer.getManifest();
5058
const resolvedVersion = (
@@ -159,6 +167,24 @@ export async function useCpythonVersion(
159167
return {impl: 'CPython', version: installed};
160168
}
161169

170+
/* Identify freethreaded versions like, 3.13t, 3.13t-dev, 3.14.0a1t. Returns
171+
* the version without the `t` and the architectures suffix, if freethreaded */
172+
function desugarFreeThreadedVersion(versionSpec: string) {
173+
const prereleaseVersion = /(\d+\.\d+\.\d+)(t)((?:a|b|rc)\d*)/g;
174+
if (prereleaseVersion.test(versionSpec)) {
175+
return [versionSpec.replace(prereleaseVersion, '$1$3'), '-freethreaded'];
176+
}
177+
const majorMinor = /^(\d+\.\d+)(t)$/;
178+
if (majorMinor.test(versionSpec)) {
179+
return [versionSpec.replace(majorMinor, '$1'), '-freethreaded'];
180+
}
181+
const devVersion = /^(\d+\.\d+)(t)(-dev)$/;
182+
if (devVersion.test(versionSpec)) {
183+
return [versionSpec.replace(devVersion, '$1$3'), '-freethreaded'];
184+
}
185+
return [versionSpec, ''];
186+
}
187+
162188
/** Convert versions like `3.8-dev` to a version like `~3.8.0-0`. */
163189
function desugarDevVersion(versionSpec: string) {
164190
const devVersion = /^(\d+)\.(\d+)-dev$/;

src/install-python.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {IS_WINDOWS, IS_LINUX, getDownloadFileName} from './utils';
88

99
const TOKEN = core.getInput('token');
1010
const AUTH = !TOKEN ? undefined : `token ${TOKEN}`;
11-
const MANIFEST_REPO_OWNER = 'actions';
11+
const MANIFEST_REPO_OWNER = 'Quansight-Labs';
1212
const MANIFEST_REPO_NAME = 'python-versions';
1313
const MANIFEST_REPO_BRANCH = 'main';
1414
export const MANIFEST_URL = `https://raw.githubusercontent.com/${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}/${MANIFEST_REPO_BRANCH}/versions-manifest.json`;

0 commit comments

Comments
 (0)