| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  | import * as core from '@actions/core'; | 
					
						
							|  |  |  | import * as finder from './find-python'; | 
					
						
							| 
									
										
										
										
											2020-12-17 18:03:54 +03:00
										 |  |  | import * as finderPyPy from './find-pypy'; | 
					
						
							| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  | import * as path from 'path'; | 
					
						
							| 
									
										
										
										
											2020-04-29 20:57:02 +03:00
										 |  |  | import * as os from 'os'; | 
					
						
							| 
									
										
										
										
											2022-06-02 07:37:57 -07:00
										 |  |  | import fs from 'fs'; | 
					
						
							| 
									
										
										
										
											2021-11-17 13:31:22 +03:00
										 |  |  | import {getCacheDistributor} from './cache-distributions/cache-factory'; | 
					
						
							| 
									
										
										
										
											2022-07-22 16:03:42 +08:00
										 |  |  | import {isCacheFeatureAvailable, logWarning, IS_MAC} from './utils'; | 
					
						
							| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-17 18:03:54 +03:00
										 |  |  | function isPyPyVersion(versionSpec: string) { | 
					
						
							| 
									
										
										
										
											2022-05-18 15:20:53 +02:00
										 |  |  |   return versionSpec.startsWith('pypy'); | 
					
						
							| 
									
										
										
										
											2020-12-17 18:03:54 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-17 13:31:22 +03:00
										 |  |  | async function cacheDependencies(cache: string, pythonVersion: string) { | 
					
						
							|  |  |  |   const cacheDependencyPath = | 
					
						
							|  |  |  |     core.getInput('cache-dependency-path') || undefined; | 
					
						
							|  |  |  |   const cacheDistributor = getCacheDistributor( | 
					
						
							|  |  |  |     cache, | 
					
						
							|  |  |  |     pythonVersion, | 
					
						
							|  |  |  |     cacheDependencyPath | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  |   await cacheDistributor.restoreCache(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  | function resolveVersionInput() { | 
					
						
							|  |  |  |   let versions = core.getMultilineInput('python-version'); | 
					
						
							| 
									
										
										
										
											2022-06-20 07:04:59 -07:00
										 |  |  |   let versionFile = core.getInput('python-version-file'); | 
					
						
							| 
									
										
										
										
											2022-06-02 07:37:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |   if (versions.length && versionFile) { | 
					
						
							| 
									
										
										
										
											2022-06-02 07:37:57 -07:00
										 |  |  |     core.warning( | 
					
						
							| 
									
										
										
										
											2022-06-30 16:25:46 +02:00
										 |  |  |       'Both python-version and python-version-file inputs are specified, only python-version will be used.' | 
					
						
							| 
									
										
										
										
											2022-06-02 07:37:57 -07:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |   if (versions.length) { | 
					
						
							|  |  |  |     return versions; | 
					
						
							| 
									
										
										
										
											2022-06-02 07:37:57 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-30 13:38:43 +02:00
										 |  |  |   if (versionFile) { | 
					
						
							| 
									
										
										
										
											2022-06-30 16:21:14 +02:00
										 |  |  |     if (!fs.existsSync(versionFile)) { | 
					
						
							| 
									
										
										
										
											2022-07-15 16:52:20 +02:00
										 |  |  |       throw new Error( | 
					
						
							|  |  |  |         `The specified python version file at: ${versionFile} doesn't exist.` | 
					
						
							| 
									
										
										
										
											2022-06-30 17:32:12 +02:00
										 |  |  |       ); | 
					
						
							| 
									
										
										
										
											2022-06-30 13:38:43 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |     const version = fs.readFileSync(versionFile, 'utf8'); | 
					
						
							| 
									
										
										
										
											2022-06-30 16:21:14 +02:00
										 |  |  |     core.info(`Resolved ${versionFile} as ${version}`); | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |     return [version]; | 
					
						
							| 
									
										
										
										
											2022-06-02 07:37:57 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-15 16:52:20 +02:00
										 |  |  |   logWarning( | 
					
						
							|  |  |  |     "Neither 'python-version' nor 'python-version-file' inputs were supplied. Attempting to find '.python-version' file." | 
					
						
							| 
									
										
										
										
											2022-06-30 13:38:43 +02:00
										 |  |  |   ); | 
					
						
							| 
									
										
										
										
											2022-07-15 16:52:20 +02:00
										 |  |  |   versionFile = '.python-version'; | 
					
						
							|  |  |  |   if (fs.existsSync(versionFile)) { | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |     const version = fs.readFileSync(versionFile, 'utf8'); | 
					
						
							| 
									
										
										
										
											2022-07-15 16:52:20 +02:00
										 |  |  |     core.info(`Resolved ${versionFile} as ${version}`); | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |     return [version]; | 
					
						
							| 
									
										
										
										
											2022-07-15 16:52:20 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   logWarning(`${versionFile} doesn't exist.`); | 
					
						
							| 
									
										
										
										
											2022-06-30 16:21:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |   return versions; | 
					
						
							| 
									
										
										
										
											2022-06-02 07:37:57 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  | async function run() { | 
					
						
							| 
									
										
										
										
											2022-07-22 16:03:42 +08:00
										 |  |  |   if (IS_MAC) { | 
					
						
							|  |  |  |     process.env['AGENT_TOOLSDIRECTORY'] = '/Users/runner/hostedtoolcache'; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-15 12:57:51 +08:00
										 |  |  |   if (process.env.AGENT_TOOLSDIRECTORY?.trim()) { | 
					
						
							| 
									
										
										
										
											2022-02-17 19:21:13 +00:00
										 |  |  |     process.env['RUNNER_TOOL_CACHE'] = process.env['AGENT_TOOLSDIRECTORY']; | 
					
						
							| 
									
										
										
										
											2022-02-17 18:35:19 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-07-22 16:03:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-27 11:28:44 +05:00
										 |  |  |   core.debug( | 
					
						
							| 
									
										
										
										
											2022-07-26 20:40:49 +08:00
										 |  |  |     `Python is expected to be installed into ${process.env['RUNNER_TOOL_CACHE']}` | 
					
						
							| 
									
										
										
										
											2022-04-27 11:28:44 +05:00
										 |  |  |   ); | 
					
						
							| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  |   try { | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |     const versions = resolveVersionInput(); | 
					
						
							| 
									
										
										
										
											2022-07-25 16:54:04 +02:00
										 |  |  |     const checkLatest = core.getBooleanInput('check-latest'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |     if (versions.length) { | 
					
						
							|  |  |  |       let pythonVersion = ''; | 
					
						
							| 
									
										
										
										
											2020-04-29 20:57:02 +03:00
										 |  |  |       const arch: string = core.getInput('architecture') || os.arch(); | 
					
						
							| 
									
										
										
										
											2022-06-29 17:00:51 +02:00
										 |  |  |       const updateEnvironment = core.getBooleanInput('update-environment'); | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |       core.startGroup('Installed versions'); | 
					
						
							|  |  |  |       for (const version of versions) { | 
					
						
							|  |  |  |         if (isPyPyVersion(version)) { | 
					
						
							|  |  |  |           const installed = await finderPyPy.findPyPyVersion( | 
					
						
							|  |  |  |             version, | 
					
						
							|  |  |  |             arch, | 
					
						
							|  |  |  |             updateEnvironment, | 
					
						
							|  |  |  |             checkLatest | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |           pythonVersion = `${installed.resolvedPyPyVersion}-${installed.resolvedPythonVersion}`; | 
					
						
							|  |  |  |           core.info( | 
					
						
							|  |  |  |             `Successfully set up PyPy ${installed.resolvedPyPyVersion} with Python (${installed.resolvedPythonVersion})` | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           const installed = await finder.useCpythonVersion( | 
					
						
							|  |  |  |             version, | 
					
						
							|  |  |  |             arch, | 
					
						
							|  |  |  |             updateEnvironment, | 
					
						
							|  |  |  |             checkLatest | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  |           pythonVersion = installed.version; | 
					
						
							|  |  |  |           core.info(`Successfully set up ${installed.impl} (${pythonVersion})`); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-17 13:31:22 +03:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-12-22 13:02:09 +01:00
										 |  |  |       core.endGroup(); | 
					
						
							| 
									
										
										
										
											2021-11-17 13:31:22 +03:00
										 |  |  |       const cache = core.getInput('cache'); | 
					
						
							| 
									
										
										
										
											2022-04-01 00:41:27 +05:30
										 |  |  |       if (cache && isCacheFeatureAvailable()) { | 
					
						
							| 
									
										
										
										
											2021-11-17 13:31:22 +03:00
										 |  |  |         await cacheDependencies(cache, pythonVersion); | 
					
						
							| 
									
										
										
										
											2020-12-17 18:03:54 +03:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-04-29 09:14:59 +05:00
										 |  |  |     } else { | 
					
						
							|  |  |  |       core.warning( | 
					
						
							| 
									
										
										
										
											2022-05-04 12:55:36 +05:00
										 |  |  |         'The `python-version` input is not set.  The version of Python currently in `PATH` will be used.' | 
					
						
							| 
									
										
										
										
											2022-04-29 09:14:59 +05:00
										 |  |  |       ); | 
					
						
							| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-17 13:31:22 +03:00
										 |  |  |     const matchersPath = path.join(__dirname, '../..', '.github'); | 
					
						
							| 
									
										
										
										
											2020-03-09 10:16:37 +01:00
										 |  |  |     core.info(`##[add-matcher]${path.join(matchersPath, 'python.json')}`); | 
					
						
							| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  |   } catch (err) { | 
					
						
							| 
									
										
										
										
											2021-11-17 13:31:22 +03:00
										 |  |  |     core.setFailed((err as Error).message); | 
					
						
							| 
									
										
										
										
											2019-08-20 10:27:52 -04:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | run(); |