Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit eb2a653

Browse filesBrowse files
committed
Support free threaded Python versions like '3.13t'
Python wheels, pyenv, and a number of other tools use 't' in the Python version number to identify free threaded builds. For example, '3.13t', '3.14.0a1', '3.14t-dev'. This PR supports that syntax in `actions/setup-python`, strips the "t", and adds "-freethreading" to the architecture to select the correct Python version. See actions#771
1 parent 0b93645 commit eb2a653
Copy full SHA for eb2a653

File tree

Expand file treeCollapse file tree

2 files changed

+53
-4
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+53
-4
lines changed

‎dist/setup/index.js

Copy file name to clipboardExpand all lines: dist/setup/index.js
+25-2Lines changed: 25 additions & 2 deletions
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$/;

‎src/find-python.ts

Copy file name to clipboardExpand all lines: src/find-python.ts
+28-2Lines changed: 28 additions & 2 deletions
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$/;

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.