mirror of
https://github.com/actions/setup-python
synced 2024-11-30 21:22:28 +08:00
5f2af211d6
* Add support for graalpy * add graalpy test workflow * format, lint and build * symlink graalpy binaries names * fix macos names for graalpy * Don't attempt to update pip for graalpy * Remove test schedule * Extract common getBinaryDirectory function for PyPy and GraalPy * Clean up and format * Pass GitHub token to GraalPy queries * Utilize pagination when querying GraalPy GitHub releases * Build * Fix lint errors * Deal with possible multiple artifacts for a single releases * Skip few GraalPy tests on windows - we don't have a windows release yet * Fix GraalPy test on Mac OS * Build * Skip one more GraalPy test on windows --------- Co-authored-by: Michael Simacek <michael.simacek@oracle.com>
147 lines
4.3 KiB
TypeScript
147 lines
4.3 KiB
TypeScript
import * as path from 'path';
|
|
import * as graalpyInstall from './install-graalpy';
|
|
import {
|
|
IS_WINDOWS,
|
|
validateVersion,
|
|
IGraalPyManifestRelease,
|
|
getBinaryDirectory
|
|
} from './utils';
|
|
|
|
import * as semver from 'semver';
|
|
import * as core from '@actions/core';
|
|
import * as tc from '@actions/tool-cache';
|
|
|
|
export async function findGraalPyVersion(
|
|
versionSpec: string,
|
|
architecture: string,
|
|
updateEnvironment: boolean,
|
|
checkLatest: boolean,
|
|
allowPreReleases: boolean
|
|
): Promise<string> {
|
|
let resolvedGraalPyVersion = '';
|
|
let installDir: string | null;
|
|
let releases: IGraalPyManifestRelease[] | undefined;
|
|
|
|
let graalpyVersionSpec = parseGraalPyVersion(versionSpec);
|
|
|
|
if (checkLatest) {
|
|
releases = await graalpyInstall.getAvailableGraalPyVersions();
|
|
if (releases && releases.length > 0) {
|
|
const releaseData = graalpyInstall.findRelease(
|
|
releases,
|
|
graalpyVersionSpec,
|
|
architecture,
|
|
false
|
|
);
|
|
|
|
if (releaseData) {
|
|
core.info(`Resolved as GraalPy ${releaseData.resolvedGraalPyVersion}`);
|
|
graalpyVersionSpec = releaseData.resolvedGraalPyVersion;
|
|
} else {
|
|
core.info(
|
|
`Failed to resolve GraalPy ${graalpyVersionSpec} from manifest`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
({installDir, resolvedGraalPyVersion} = findGraalPyToolCache(
|
|
graalpyVersionSpec,
|
|
architecture
|
|
));
|
|
|
|
if (!installDir) {
|
|
({installDir, resolvedGraalPyVersion} = await graalpyInstall.installGraalPy(
|
|
graalpyVersionSpec,
|
|
architecture,
|
|
allowPreReleases,
|
|
releases
|
|
));
|
|
}
|
|
|
|
const pipDir = IS_WINDOWS ? 'Scripts' : 'bin';
|
|
const _binDir = path.join(installDir, pipDir);
|
|
const binaryExtension = IS_WINDOWS ? '.exe' : '';
|
|
const pythonPath = path.join(
|
|
IS_WINDOWS ? installDir : _binDir,
|
|
`python${binaryExtension}`
|
|
);
|
|
const pythonLocation = getBinaryDirectory(installDir);
|
|
if (updateEnvironment) {
|
|
core.exportVariable('pythonLocation', installDir);
|
|
// https://cmake.org/cmake/help/latest/module/FindPython.html#module:FindPython
|
|
core.exportVariable('Python_ROOT_DIR', installDir);
|
|
// https://cmake.org/cmake/help/latest/module/FindPython2.html#module:FindPython2
|
|
core.exportVariable('Python2_ROOT_DIR', installDir);
|
|
// https://cmake.org/cmake/help/latest/module/FindPython3.html#module:FindPython3
|
|
core.exportVariable('Python3_ROOT_DIR', installDir);
|
|
core.exportVariable('PKG_CONFIG_PATH', pythonLocation + '/lib/pkgconfig');
|
|
core.addPath(pythonLocation);
|
|
core.addPath(_binDir);
|
|
}
|
|
core.setOutput('python-version', 'graalpy' + resolvedGraalPyVersion);
|
|
core.setOutput('python-path', pythonPath);
|
|
|
|
return resolvedGraalPyVersion;
|
|
}
|
|
|
|
export function findGraalPyToolCache(
|
|
graalpyVersion: string,
|
|
architecture: string
|
|
) {
|
|
let resolvedGraalPyVersion = '';
|
|
let installDir: string | null = tc.find(
|
|
'GraalPy',
|
|
graalpyVersion,
|
|
architecture
|
|
);
|
|
|
|
if (installDir) {
|
|
// 'tc.find' finds tool based on Python version but we also need to check
|
|
// whether GraalPy version satisfies requested version.
|
|
resolvedGraalPyVersion = path.basename(path.dirname(installDir));
|
|
|
|
const isGraalPyVersionSatisfies = semver.satisfies(
|
|
resolvedGraalPyVersion,
|
|
graalpyVersion
|
|
);
|
|
if (!isGraalPyVersionSatisfies) {
|
|
installDir = null;
|
|
resolvedGraalPyVersion = '';
|
|
}
|
|
}
|
|
|
|
if (!installDir) {
|
|
core.info(
|
|
`GraalPy version ${graalpyVersion} was not found in the local cache`
|
|
);
|
|
}
|
|
|
|
return {installDir, resolvedGraalPyVersion};
|
|
}
|
|
|
|
export function parseGraalPyVersion(versionSpec: string): string {
|
|
const versions = versionSpec.split('-').filter(item => !!item);
|
|
|
|
if (/^(graalpy)(.+)/.test(versions[0])) {
|
|
const version = versions[0].replace('graalpy', '');
|
|
versions.splice(0, 1, 'graalpy', version);
|
|
}
|
|
|
|
if (versions.length < 2 || versions[0] != 'graalpy') {
|
|
throw new Error(
|
|
"Invalid 'version' property for GraalPy. GraalPy version should be specified as 'graalpy<python-version>' or 'graalpy-<python-version>'. See README for examples and documentation."
|
|
);
|
|
}
|
|
|
|
const pythonVersion = versions[1];
|
|
|
|
if (!validateVersion(pythonVersion)) {
|
|
throw new Error(
|
|
"Invalid 'version' property for GraalPy. GraalPy versions should satisfy SemVer notation. See README for examples and documentation."
|
|
);
|
|
}
|
|
|
|
return pythonVersion;
|
|
}
|