You've already forked setup-python
							
							
				mirror of
				https://github.com/actions/setup-python.git
				synced 2025-10-31 15:16:23 +07:00 
			
		
		
		
	fix: install PyPy on Linux ARM64 (#1011)
* ci: check non-eol versions of PyPy are available on all runners * fix: install PyPy on Linux ARM64 * ci: remove eol ubuntu-20.04
This commit is contained in:
		
							
								
								
									
										53
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								.github/workflows/test-pypy.yml
									
									
									
									
										vendored
									
									
								
							| @ -69,6 +69,59 @@ jobs: | |||||||
|           ${EXECUTABLE} --version |           ${EXECUTABLE} --version | ||||||
|         shell: bash |         shell: bash | ||||||
|  |  | ||||||
|  |   check-non-eol: | ||||||
|  |     name: Check non-eol ${{ matrix.pypy }} on ${{ matrix.os }} | ||||||
|  |     runs-on: ${{ matrix.os }} | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         os: | ||||||
|  |           - macos-13 | ||||||
|  |           - macos-14 | ||||||
|  |           - macos-15 | ||||||
|  |           - windows-2019 | ||||||
|  |           - windows-2022 | ||||||
|  |           - windows-2025 | ||||||
|  |           - ubuntu-22.04 | ||||||
|  |           - ubuntu-24.04 | ||||||
|  |           - ubuntu-22.04-arm | ||||||
|  |           - ubuntu-24.04-arm | ||||||
|  |         pypy: ['pypy-2.7', 'pypy-3.10'] | ||||||
|  |  | ||||||
|  |     steps: | ||||||
|  |       - name: Checkout | ||||||
|  |         uses: actions/checkout@v4 | ||||||
|  |  | ||||||
|  |       - name: setup-python ${{ matrix.pypy }} | ||||||
|  |         id: setup-python | ||||||
|  |         uses: ./ | ||||||
|  |         with: | ||||||
|  |           python-version: ${{ matrix.pypy }} | ||||||
|  |  | ||||||
|  |       - name: Check python-path | ||||||
|  |         run: ./__tests__/check-python-path.sh '${{ steps.setup-python.outputs.python-path }}' | ||||||
|  |         shell: bash | ||||||
|  |  | ||||||
|  |       - name: PyPy and Python version | ||||||
|  |         run: python --version | ||||||
|  |  | ||||||
|  |       - name: Run simple code | ||||||
|  |         run: python -c 'import math; print(math.factorial(5))' | ||||||
|  |  | ||||||
|  |       - name: Assert PyPy is running | ||||||
|  |         run: | | ||||||
|  |           import platform | ||||||
|  |           assert platform.python_implementation().lower() == "pypy" | ||||||
|  |         shell: python | ||||||
|  |  | ||||||
|  |       - name: Assert expected binaries (or symlinks) are present | ||||||
|  |         run: | | ||||||
|  |           EXECUTABLE=${{ matrix.pypy }} | ||||||
|  |           EXECUTABLE=${EXECUTABLE/pypy-/pypy}  # remove the first '-' in "pypy-X.Y" -> "pypyX.Y" to match executable name | ||||||
|  |           EXECUTABLE=${EXECUTABLE%%-*}  # remove any -* suffixe | ||||||
|  |           ${EXECUTABLE} --version | ||||||
|  |         shell: bash | ||||||
|  |  | ||||||
|   setup-pypy-noenv: |   setup-pypy-noenv: | ||||||
|     name: Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) |     name: Setup PyPy ${{ matrix.pypy }} ${{ matrix.os }} (noenv) | ||||||
|     runs-on: ${{ matrix.os }} |     runs-on: ${{ matrix.os }} | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							| @ -100062,28 +100062,33 @@ function pypyVersionToSemantic(versionSpec) { | |||||||
| } | } | ||||||
| exports.pypyVersionToSemantic = pypyVersionToSemantic; | exports.pypyVersionToSemantic = pypyVersionToSemantic; | ||||||
| function isArchPresentForWindows(item, architecture) { | function isArchPresentForWindows(item, architecture) { | ||||||
|     architecture = replaceX32toX86(architecture); |     architecture = pypyArchitecture(architecture); | ||||||
|     return item.files.some((file) => utils_1.WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture); |     return item.files.some((file) => utils_1.WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture); | ||||||
| } | } | ||||||
| exports.isArchPresentForWindows = isArchPresentForWindows; | exports.isArchPresentForWindows = isArchPresentForWindows; | ||||||
| function isArchPresentForMacOrLinux(item, architecture, platform) { | function isArchPresentForMacOrLinux(item, architecture, platform) { | ||||||
|  |     architecture = pypyArchitecture(architecture); | ||||||
|     return item.files.some((file) => file.arch === architecture && file.platform === platform); |     return item.files.some((file) => file.arch === architecture && file.platform === platform); | ||||||
| } | } | ||||||
| exports.isArchPresentForMacOrLinux = isArchPresentForMacOrLinux; | exports.isArchPresentForMacOrLinux = isArchPresentForMacOrLinux; | ||||||
| function findAssetForWindows(releases, architecture) { | function findAssetForWindows(releases, architecture) { | ||||||
|     architecture = replaceX32toX86(architecture); |     architecture = pypyArchitecture(architecture); | ||||||
|     return releases.files.find((item) => utils_1.WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture); |     return releases.files.find((item) => utils_1.WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture); | ||||||
| } | } | ||||||
| exports.findAssetForWindows = findAssetForWindows; | exports.findAssetForWindows = findAssetForWindows; | ||||||
| function findAssetForMacOrLinux(releases, architecture, platform) { | function findAssetForMacOrLinux(releases, architecture, platform) { | ||||||
|  |     architecture = pypyArchitecture(architecture); | ||||||
|     return releases.files.find((item) => item.arch === architecture && item.platform === platform); |     return releases.files.find((item) => item.arch === architecture && item.platform === platform); | ||||||
| } | } | ||||||
| exports.findAssetForMacOrLinux = findAssetForMacOrLinux; | exports.findAssetForMacOrLinux = findAssetForMacOrLinux; | ||||||
| function replaceX32toX86(architecture) { | function pypyArchitecture(architecture) { | ||||||
|     // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
 |     if (utils_1.IS_WINDOWS && architecture === 'x32') { | ||||||
|     if (architecture === 'x32') { |         // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value.
 | ||||||
|         architecture = 'x86'; |         architecture = 'x86'; | ||||||
|     } |     } | ||||||
|  |     else if (utils_1.IS_LINUX && architecture === 'arm64') { | ||||||
|  |         architecture = 'aarch64'; | ||||||
|  |     } | ||||||
|     return architecture; |     return architecture; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ import * as exec from '@actions/exec'; | |||||||
| import fs from 'fs'; | import fs from 'fs'; | ||||||
|  |  | ||||||
| import { | import { | ||||||
|  |   IS_LINUX, | ||||||
|   IS_WINDOWS, |   IS_WINDOWS, | ||||||
|   WINDOWS_PLATFORMS, |   WINDOWS_PLATFORMS, | ||||||
|   IPyPyManifestRelease, |   IPyPyManifestRelease, | ||||||
| @ -246,7 +247,7 @@ export function pypyVersionToSemantic(versionSpec: string) { | |||||||
| } | } | ||||||
|  |  | ||||||
| export function isArchPresentForWindows(item: any, architecture: string) { | export function isArchPresentForWindows(item: any, architecture: string) { | ||||||
|   architecture = replaceX32toX86(architecture); |   architecture = pypyArchitecture(architecture); | ||||||
|   return item.files.some( |   return item.files.some( | ||||||
|     (file: any) => |     (file: any) => | ||||||
|       WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture |       WINDOWS_PLATFORMS.includes(file.platform) && file.arch === architecture | ||||||
| @ -258,13 +259,14 @@ export function isArchPresentForMacOrLinux( | |||||||
|   architecture: string, |   architecture: string, | ||||||
|   platform: string |   platform: string | ||||||
| ) { | ) { | ||||||
|  |   architecture = pypyArchitecture(architecture); | ||||||
|   return item.files.some( |   return item.files.some( | ||||||
|     (file: any) => file.arch === architecture && file.platform === platform |     (file: any) => file.arch === architecture && file.platform === platform | ||||||
|   ); |   ); | ||||||
| } | } | ||||||
|  |  | ||||||
| export function findAssetForWindows(releases: any, architecture: string) { | export function findAssetForWindows(releases: any, architecture: string) { | ||||||
|   architecture = replaceX32toX86(architecture); |   architecture = pypyArchitecture(architecture); | ||||||
|   return releases.files.find( |   return releases.files.find( | ||||||
|     (item: any) => |     (item: any) => | ||||||
|       WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture |       WINDOWS_PLATFORMS.includes(item.platform) && item.arch === architecture | ||||||
| @ -276,15 +278,18 @@ export function findAssetForMacOrLinux( | |||||||
|   architecture: string, |   architecture: string, | ||||||
|   platform: string |   platform: string | ||||||
| ) { | ) { | ||||||
|  |   architecture = pypyArchitecture(architecture); | ||||||
|   return releases.files.find( |   return releases.files.find( | ||||||
|     (item: any) => item.arch === architecture && item.platform === platform |     (item: any) => item.arch === architecture && item.platform === platform | ||||||
|   ); |   ); | ||||||
| } | } | ||||||
|  |  | ||||||
| function replaceX32toX86(architecture: string): string { | function pypyArchitecture(architecture: string): string { | ||||||
|   // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value. |   if (IS_WINDOWS && architecture === 'x32') { | ||||||
|   if (architecture === 'x32') { |     // convert x32 to x86 because os.arch() returns x32 for 32-bit systems but PyPy releases json has x86 arch value. | ||||||
|     architecture = 'x86'; |     architecture = 'x86'; | ||||||
|  |   } else if (IS_LINUX && architecture === 'arm64') { | ||||||
|  |     architecture = 'aarch64'; | ||||||
|   } |   } | ||||||
|   return architecture; |   return architecture; | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Matthieu Darbois
					Matthieu Darbois