Compare commits

..

No commits in common. "v2.0.2" and "master" have entirely different histories.

5 changed files with 278 additions and 290 deletions

View File

@ -2,7 +2,7 @@ name: Validate 'setup-python'
on: on:
push: push:
branches: branches:
- main - master
paths-ignore: paths-ignore:
- '**.md' - '**.md'
pull_request: pull_request:

View File

@ -2,7 +2,7 @@ name: Main workflow
on: on:
push: push:
branches: branches:
- main - master
paths-ignore: paths-ignore:
- '**.md' - '**.md'
pull_request: pull_request:

View File

@ -106,7 +106,7 @@ Check out our detailed guide on using [Python with GitHub Actions](https://help.
- If `3.8.1` is installed for example, and `3.8.2` is released, expect `3.8.1` to be removed and replaced by `3.8.2` in the tools cache. - If `3.8.1` is installed for example, and `3.8.2` is released, expect `3.8.1` to be removed and replaced by `3.8.2` in the tools cache.
- If the exact patch version doesn't matter to you, specifying just the major and minor version will get you the latest preinstalled patch version. In the previous example, the version spec `3.8` will use the `3.8.2` Python version found in the cache. - If the exact patch version doesn't matter to you, specifying just the major and minor version will get you the latest preinstalled patch version. In the previous example, the version spec `3.8` will use the `3.8.2` Python version found in the cache.
- Downloadable Python versions from GitHub Releases ([actions/python-versions](https://github.com/actions/python-versions/releases)) - Downloadable Python versions from GitHub Releases ([actions/python-versions](https://github.com/actions/python-versions/releases))
- All available versions are listed in the [version-manifest.json](https://github.com/actions/python-versions/blob/main/versions-manifest.json) file. - All available versions are listed in the [version-manifest.json](https://github.com/actions/python-versions/blob/master/versions-manifest.json) file.
- If there is a specific version of Python that is not available, you can open an issue here - If there is a specific version of Python that is not available, you can open an issue here
# Hosted Tool Cache # Hosted Tool Cache
@ -136,9 +136,7 @@ You should specify only a major and minor version if you are okay with the most
# Using `setup-python` with a self hosted runner # Using `setup-python` with a self hosted runner
Python distributions are only available for the same [environments](https://github.com/actions/virtual-environments#available-environments) that GitHub Actions hosted environments are available for. If you are using an unsupported version of Ubuntu such as `19.04` or another Linux distribution such as Fedora, `setup-python` will not work. If you have a supported self-hosted runner and you would like to use `setup-python`, there are a few extra things you need to make sure are set up so that new versions of Python can be downloaded and configured on your runner. If you would like to use `setup-python` and a self-hosted runner, there are a few extra things you need to make sure are set up so that new versions of Python can be downloaded and configured on your runner.
If you are experiencing problems while configuring Python on your self-hosted runner, turn on [step debugging](https://github.com/actions/toolkit/blob/main/docs/action-debugging.md#step-debug-logs) to see addition logs.
### Windows ### Windows

546
dist/index.js vendored
View File

@ -2361,46 +2361,46 @@ const Range = __webpack_require__(124)
/***/ (function(__unusedmodule, exports, __webpack_require__) { /***/ (function(__unusedmodule, exports, __webpack_require__) {
"use strict"; "use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) { var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod; if (mod && mod.__esModule) return mod;
var result = {}; var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod; result["default"] = mod;
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const core = __importStar(__webpack_require__(470)); const core = __importStar(__webpack_require__(470));
const finder = __importStar(__webpack_require__(927)); const finder = __importStar(__webpack_require__(927));
const path = __importStar(__webpack_require__(622)); const path = __importStar(__webpack_require__(622));
const os = __importStar(__webpack_require__(87)); const os = __importStar(__webpack_require__(87));
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
try { try {
let version = core.getInput('python-version'); let version = core.getInput('python-version');
if (version) { if (version) {
const arch = core.getInput('architecture') || os.arch(); const arch = core.getInput('architecture') || os.arch();
const installed = yield finder.findPythonVersion(version, arch); const installed = yield finder.findPythonVersion(version, arch);
core.info(`Successfully setup ${installed.impl} (${installed.version})`); core.info(`Successfully setup ${installed.impl} (${installed.version})`);
} }
const matchersPath = path.join(__dirname, '..', '.github'); const matchersPath = path.join(__dirname, '..', '.github');
core.info(`##[add-matcher]${path.join(matchersPath, 'python.json')}`); core.info(`##[add-matcher]${path.join(matchersPath, 'python.json')}`);
} }
catch (err) { catch (err) {
core.setFailed(err.message); core.setFailed(err.message);
} }
}); });
} }
run(); run();
/***/ }), /***/ }),
@ -6312,87 +6312,83 @@ module.exports = diff
/***/ (function(__unusedmodule, exports, __webpack_require__) { /***/ (function(__unusedmodule, exports, __webpack_require__) {
"use strict"; "use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) { var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod; if (mod && mod.__esModule) return mod;
var result = {}; var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod; result["default"] = mod;
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const path = __importStar(__webpack_require__(622)); const path = __importStar(__webpack_require__(622));
const core = __importStar(__webpack_require__(470)); const core = __importStar(__webpack_require__(470));
const tc = __importStar(__webpack_require__(533)); const tc = __importStar(__webpack_require__(533));
const exec = __importStar(__webpack_require__(986)); const exec = __importStar(__webpack_require__(986));
const TOKEN = core.getInput('token'); const TOKEN = core.getInput('token');
const AUTH = !TOKEN || isGhes() ? undefined : `token ${TOKEN}`; const AUTH = !TOKEN || isGhes() ? undefined : `token ${TOKEN}`;
const MANIFEST_REPO_OWNER = 'actions'; const MANIFEST_REPO_OWNER = 'actions';
const MANIFEST_REPO_NAME = 'python-versions'; const MANIFEST_REPO_NAME = 'python-versions';
const MANIFEST_REPO_BRANCH = 'main'; exports.MANIFEST_URL = `https://raw.githubusercontent.com/${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}/master/versions-manifest.json`;
exports.MANIFEST_URL = `https://raw.githubusercontent.com/${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}/${MANIFEST_REPO_BRANCH}/versions-manifest.json`; const IS_WINDOWS = process.platform === 'win32';
const IS_WINDOWS = process.platform === 'win32'; function findReleaseFromManifest(semanticVersionSpec, architecture) {
function findReleaseFromManifest(semanticVersionSpec, architecture) { return __awaiter(this, void 0, void 0, function* () {
return __awaiter(this, void 0, void 0, function* () { const manifest = yield tc.getManifestFromRepo(MANIFEST_REPO_OWNER, MANIFEST_REPO_NAME, AUTH);
const manifest = yield tc.getManifestFromRepo(MANIFEST_REPO_OWNER, MANIFEST_REPO_NAME, AUTH, MANIFEST_REPO_BRANCH); return yield tc.findFromManifest(semanticVersionSpec, true, manifest, architecture);
return yield tc.findFromManifest(semanticVersionSpec, true, manifest, architecture); });
}); }
} exports.findReleaseFromManifest = findReleaseFromManifest;
exports.findReleaseFromManifest = findReleaseFromManifest; function installPython(workingDirectory) {
function installPython(workingDirectory) { return __awaiter(this, void 0, void 0, function* () {
return __awaiter(this, void 0, void 0, function* () { const options = {
const options = { cwd: workingDirectory,
cwd: workingDirectory, silent: true,
silent: true, listeners: {
listeners: { stdout: (data) => {
stdout: (data) => { core.debug(data.toString().trim());
core.info(data.toString().trim()); }
}, }
stderr: (data) => { };
core.error(data.toString().trim()); if (IS_WINDOWS) {
} yield exec.exec('powershell', ['./setup.ps1'], options);
} }
}; else {
if (IS_WINDOWS) { yield exec.exec('bash', ['./setup.sh'], options);
yield exec.exec('powershell', ['./setup.ps1'], options); }
} });
else { }
yield exec.exec('bash', ['./setup.sh'], options); function installCpythonFromRelease(release) {
} return __awaiter(this, void 0, void 0, function* () {
}); const downloadUrl = release.files[0].download_url;
} core.info(`Download from "${downloadUrl}"`);
function installCpythonFromRelease(release) { const pythonPath = yield tc.downloadTool(downloadUrl, undefined, AUTH);
return __awaiter(this, void 0, void 0, function* () { const fileName = path.basename(pythonPath, '.zip');
const downloadUrl = release.files[0].download_url; core.info('Extract downloaded archive');
core.info(`Download from "${downloadUrl}"`); let pythonExtractedFolder;
const pythonPath = yield tc.downloadTool(downloadUrl, undefined, AUTH); if (IS_WINDOWS) {
const fileName = path.basename(pythonPath, '.zip'); pythonExtractedFolder = yield tc.extractZip(pythonPath, `./${fileName}`);
core.info('Extract downloaded archive'); }
let pythonExtractedFolder; else {
if (IS_WINDOWS) { pythonExtractedFolder = yield tc.extractTar(pythonPath, `./${fileName}`);
pythonExtractedFolder = yield tc.extractZip(pythonPath, `./${fileName}`); }
} core.info('Execute installation script');
else { yield installPython(pythonExtractedFolder);
pythonExtractedFolder = yield tc.extractTar(pythonPath, `./${fileName}`); });
} }
core.info('Execute installation script'); exports.installCpythonFromRelease = installCpythonFromRelease;
yield installPython(pythonExtractedFolder); function isGhes() {
}); const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');
} return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
exports.installCpythonFromRelease = installCpythonFromRelease; }
function isGhes() {
const ghUrl = new URL(process.env['GITHUB_SERVER_URL'] || 'https://github.com');
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
}
/***/ }), /***/ }),
@ -6573,160 +6569,160 @@ module.exports = lte
/***/ (function(__unusedmodule, exports, __webpack_require__) { /***/ (function(__unusedmodule, exports, __webpack_require__) {
"use strict"; "use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) { var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod; if (mod && mod.__esModule) return mod;
var result = {}; var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod; result["default"] = mod;
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const os = __importStar(__webpack_require__(87)); const os = __importStar(__webpack_require__(87));
const path = __importStar(__webpack_require__(622)); const path = __importStar(__webpack_require__(622));
const semver = __importStar(__webpack_require__(876)); const semver = __importStar(__webpack_require__(876));
const installer = __importStar(__webpack_require__(824)); const installer = __importStar(__webpack_require__(824));
const core = __importStar(__webpack_require__(470)); const core = __importStar(__webpack_require__(470));
const tc = __importStar(__webpack_require__(533)); const tc = __importStar(__webpack_require__(533));
const IS_WINDOWS = process.platform === 'win32'; const IS_WINDOWS = process.platform === 'win32';
// Python has "scripts" or "bin" directories where command-line tools that come with packages are installed. // Python has "scripts" or "bin" directories where command-line tools that come with packages are installed.
// This is where pip is, along with anything that pip installs. // This is where pip is, along with anything that pip installs.
// There is a seperate directory for `pip install --user`. // There is a seperate directory for `pip install --user`.
// //
// For reference, these directories are as follows: // For reference, these directories are as follows:
// macOS / Linux: // macOS / Linux:
// <sys.prefix>/bin (by default /usr/local/bin, but not on hosted agents -- see the `else`) // <sys.prefix>/bin (by default /usr/local/bin, but not on hosted agents -- see the `else`)
// (--user) ~/.local/bin // (--user) ~/.local/bin
// Windows: // Windows:
// <Python installation dir>\Scripts // <Python installation dir>\Scripts
// (--user) %APPDATA%\Python\PythonXY\Scripts // (--user) %APPDATA%\Python\PythonXY\Scripts
// See https://docs.python.org/3/library/sysconfig.html // See https://docs.python.org/3/library/sysconfig.html
function binDir(installDir) { function binDir(installDir) {
if (IS_WINDOWS) { if (IS_WINDOWS) {
return path.join(installDir, 'Scripts'); return path.join(installDir, 'Scripts');
} }
else { else {
return path.join(installDir, 'bin'); return path.join(installDir, 'bin');
} }
} }
// Note on the tool cache layout for PyPy: // Note on the tool cache layout for PyPy:
// PyPy has its own versioning scheme that doesn't follow the Python versioning scheme. // PyPy has its own versioning scheme that doesn't follow the Python versioning scheme.
// A particular version of PyPy may contain one or more versions of the Python interpreter. // A particular version of PyPy may contain one or more versions of the Python interpreter.
// For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha. // For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha.
// We only care about the Python version, so we don't use the PyPy version for the tool cache. // We only care about the Python version, so we don't use the PyPy version for the tool cache.
function usePyPy(majorVersion, architecture) { function usePyPy(majorVersion, architecture) {
const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion.toString()); const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion.toString());
let installDir = findPyPy(architecture); let installDir = findPyPy(architecture);
if (!installDir && IS_WINDOWS) { if (!installDir && IS_WINDOWS) {
// PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64. // PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64.
// On our Windows virtual environments, we only install an x86 version. // On our Windows virtual environments, we only install an x86 version.
// Fall back to x86. // Fall back to x86.
installDir = findPyPy('x86'); installDir = findPyPy('x86');
} }
if (!installDir) { if (!installDir) {
// PyPy not installed in $(Agent.ToolsDirectory) // PyPy not installed in $(Agent.ToolsDirectory)
throw new Error(`PyPy ${majorVersion} not found`); throw new Error(`PyPy ${majorVersion} not found`);
} }
// For PyPy, Windows uses 'bin', not 'Scripts'. // For PyPy, Windows uses 'bin', not 'Scripts'.
const _binDir = path.join(installDir, 'bin'); const _binDir = path.join(installDir, 'bin');
// On Linux and macOS, the Python interpreter is in 'bin'. // On Linux and macOS, the Python interpreter is in 'bin'.
// On Windows, it is in the installation root. // On Windows, it is in the installation root.
const pythonLocation = IS_WINDOWS ? installDir : _binDir; const pythonLocation = IS_WINDOWS ? installDir : _binDir;
core.exportVariable('pythonLocation', pythonLocation); core.exportVariable('pythonLocation', pythonLocation);
core.addPath(installDir); core.addPath(installDir);
core.addPath(_binDir); core.addPath(_binDir);
const impl = 'pypy' + majorVersion.toString(); const impl = 'pypy' + majorVersion.toString();
core.setOutput('python-version', impl); core.setOutput('python-version', impl);
return { impl: impl, version: versionFromPath(installDir) }; return { impl: impl, version: versionFromPath(installDir) };
} }
function useCpythonVersion(version, architecture) { function useCpythonVersion(version, architecture) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const desugaredVersionSpec = desugarDevVersion(version); const desugaredVersionSpec = desugarDevVersion(version);
const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec); const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec);
core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`); core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`);
let installDir = tc.find('Python', semanticVersionSpec, architecture); let installDir = tc.find('Python', semanticVersionSpec, architecture);
if (!installDir) { if (!installDir) {
core.info(`Version ${semanticVersionSpec} was not found in the local cache`); core.info(`Version ${semanticVersionSpec} was not found in the local cache`);
const foundRelease = yield installer.findReleaseFromManifest(semanticVersionSpec, architecture); const foundRelease = yield installer.findReleaseFromManifest(semanticVersionSpec, architecture);
if (foundRelease && foundRelease.files && foundRelease.files.length > 0) { if (foundRelease && foundRelease.files && foundRelease.files.length > 0) {
core.info(`Version ${semanticVersionSpec} is available for downloading`); core.info(`Version ${semanticVersionSpec} is available for downloading`);
yield installer.installCpythonFromRelease(foundRelease); yield installer.installCpythonFromRelease(foundRelease);
installDir = tc.find('Python', semanticVersionSpec, architecture); installDir = tc.find('Python', semanticVersionSpec, architecture);
} }
} }
if (!installDir) { if (!installDir) {
throw new Error([ throw new Error([
`Version ${version} with arch ${architecture} not found`, `Version ${version} with arch ${architecture} not found`,
`The list of all available versions can be found here: ${installer.MANIFEST_URL}` `The list of all available versions can be found here: ${installer.MANIFEST_URL}`
].join(os.EOL)); ].join(os.EOL));
} }
core.exportVariable('pythonLocation', installDir); core.exportVariable('pythonLocation', installDir);
core.addPath(installDir); core.addPath(installDir);
core.addPath(binDir(installDir)); core.addPath(binDir(installDir));
if (IS_WINDOWS) { if (IS_WINDOWS) {
// Add --user directory // Add --user directory
// `installDir` from tool cache should look like $RUNNER_TOOL_CACHE/Python/<semantic version>/x64/ // `installDir` from tool cache should look like $RUNNER_TOOL_CACHE/Python/<semantic version>/x64/
// So if `findLocalTool` succeeded above, we must have a conformant `installDir` // So if `findLocalTool` succeeded above, we must have a conformant `installDir`
const version = path.basename(path.dirname(installDir)); const version = path.basename(path.dirname(installDir));
const major = semver.major(version); const major = semver.major(version);
const minor = semver.minor(version); const minor = semver.minor(version);
const userScriptsDir = path.join(process.env['APPDATA'] || '', 'Python', `Python${major}${minor}`, 'Scripts'); const userScriptsDir = path.join(process.env['APPDATA'] || '', 'Python', `Python${major}${minor}`, 'Scripts');
core.addPath(userScriptsDir); core.addPath(userScriptsDir);
} }
// On Linux and macOS, pip will create the --user directory and add it to PATH as needed. // On Linux and macOS, pip will create the --user directory and add it to PATH as needed.
const installed = versionFromPath(installDir); const installed = versionFromPath(installDir);
core.setOutput('python-version', installed); core.setOutput('python-version', installed);
return { impl: 'CPython', version: installed }; return { impl: 'CPython', version: installed };
}); });
} }
/** Convert versions like `3.8-dev` to a version like `>= 3.8.0-a0`. */ /** Convert versions like `3.8-dev` to a version like `>= 3.8.0-a0`. */
function desugarDevVersion(versionSpec) { function desugarDevVersion(versionSpec) {
if (versionSpec.endsWith('-dev')) { if (versionSpec.endsWith('-dev')) {
const versionRoot = versionSpec.slice(0, -'-dev'.length); const versionRoot = versionSpec.slice(0, -'-dev'.length);
return `>= ${versionRoot}.0-a0`; return `>= ${versionRoot}.0-a0`;
} }
else { else {
return versionSpec; return versionSpec;
} }
} }
/** Extracts python version from install path from hosted tool cache as described in README.md */ /** Extracts python version from install path from hosted tool cache as described in README.md */
function versionFromPath(installDir) { function versionFromPath(installDir) {
const parts = installDir.split(path.sep); const parts = installDir.split(path.sep);
const idx = parts.findIndex(part => part === 'PyPy' || part === 'Python'); const idx = parts.findIndex(part => part === 'PyPy' || part === 'Python');
return parts[idx + 1] || ''; return parts[idx + 1] || '';
} }
/** /**
* Python's prelease versions look like `3.7.0b2`. * Python's prelease versions look like `3.7.0b2`.
* This is the one part of Python versioning that does not look like semantic versioning, which specifies `3.7.0-b2`. * This is the one part of Python versioning that does not look like semantic versioning, which specifies `3.7.0-b2`.
* If the version spec contains prerelease versions, we need to convert them to the semantic version equivalent. * If the version spec contains prerelease versions, we need to convert them to the semantic version equivalent.
*/ */
function pythonVersionToSemantic(versionSpec) { function pythonVersionToSemantic(versionSpec) {
const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g; const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g;
return versionSpec.replace(prereleaseVersion, '$1-$2'); return versionSpec.replace(prereleaseVersion, '$1-$2');
} }
exports.pythonVersionToSemantic = pythonVersionToSemantic; exports.pythonVersionToSemantic = pythonVersionToSemantic;
function findPythonVersion(version, architecture) { function findPythonVersion(version, architecture) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
switch (version.toUpperCase()) { switch (version.toUpperCase()) {
case 'PYPY2': case 'PYPY2':
return usePyPy(2, architecture); return usePyPy(2, architecture);
case 'PYPY3': case 'PYPY3':
return usePyPy(3, architecture); return usePyPy(3, architecture);
default: default:
return yield useCpythonVersion(version, architecture); return yield useCpythonVersion(version, architecture);
} }
}); });
} }
exports.findPythonVersion = findPythonVersion; exports.findPythonVersion = findPythonVersion;
/***/ }), /***/ }),

View File

@ -3,14 +3,12 @@ import * as core from '@actions/core';
import * as tc from '@actions/tool-cache'; import * as tc from '@actions/tool-cache';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
import {ExecOptions} from '@actions/exec/lib/interfaces'; import {ExecOptions} from '@actions/exec/lib/interfaces';
import {stderr} from 'process';
const TOKEN = core.getInput('token'); const TOKEN = core.getInput('token');
const AUTH = !TOKEN || isGhes() ? undefined : `token ${TOKEN}`; const AUTH = !TOKEN || isGhes() ? undefined : `token ${TOKEN}`;
const MANIFEST_REPO_OWNER = 'actions'; const MANIFEST_REPO_OWNER = 'actions';
const MANIFEST_REPO_NAME = 'python-versions'; const MANIFEST_REPO_NAME = 'python-versions';
const MANIFEST_REPO_BRANCH = 'main'; export const MANIFEST_URL = `https://raw.githubusercontent.com/${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}/master/versions-manifest.json`;
export const MANIFEST_URL = `https://raw.githubusercontent.com/${MANIFEST_REPO_OWNER}/${MANIFEST_REPO_NAME}/${MANIFEST_REPO_BRANCH}/versions-manifest.json`;
const IS_WINDOWS = process.platform === 'win32'; const IS_WINDOWS = process.platform === 'win32';
@ -21,8 +19,7 @@ export async function findReleaseFromManifest(
const manifest: tc.IToolRelease[] = await tc.getManifestFromRepo( const manifest: tc.IToolRelease[] = await tc.getManifestFromRepo(
MANIFEST_REPO_OWNER, MANIFEST_REPO_OWNER,
MANIFEST_REPO_NAME, MANIFEST_REPO_NAME,
AUTH, AUTH
MANIFEST_REPO_BRANCH
); );
return await tc.findFromManifest( return await tc.findFromManifest(
semanticVersionSpec, semanticVersionSpec,
@ -38,10 +35,7 @@ async function installPython(workingDirectory: string) {
silent: true, silent: true,
listeners: { listeners: {
stdout: (data: Buffer) => { stdout: (data: Buffer) => {
core.info(data.toString().trim()); core.debug(data.toString().trim());
},
stderr: (data: Buffer) => {
core.error(data.toString().trim());
} }
} }
}; };