diff --git a/__tests__/install-python.test.ts b/__tests__/install-python.test.ts index 8763aed5..70a109ac 100644 --- a/__tests__/install-python.test.ts +++ b/__tests__/install-python.test.ts @@ -9,7 +9,25 @@ import * as tc from '@actions/tool-cache'; jest.mock('@actions/http-client'); jest.mock('@actions/tool-cache'); -const mockManifest = [{version: '3.12.0'}]; +const mockManifest = [ + { + version: '3.9.0', + stable: true, + release_url: 'https://example.com/release-url', + files: [ + { + filename: 'python-3.9.0-macosx10.9.pkg', + arch: 'x64', + platform: 'darwin', + download_url: 'https://example.com/download-url' + } + ] + } +]; + +beforeEach(() => { + jest.resetAllMocks(); +}); describe('getManifest', () => { it('should return manifest from repo', async () => { diff --git a/dist/setup/index.js b/dist/setup/index.js index bf91b555..4ec6e453 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -91637,7 +91637,6 @@ function findReleaseFromManifest(semanticVersionSpec, architecture, manifest) { return __awaiter(this, void 0, void 0, function* () { if (!manifest) { manifest = yield getManifest(); - core.info('manifest :>> ' + JSON.stringify(manifest)); } const foundRelease = yield tc.findFromManifest(semanticVersionSpec, false, manifest, architecture); core.info(`Found release: ${JSON.stringify(foundRelease)}`); @@ -91648,28 +91647,14 @@ exports.findReleaseFromManifest = findReleaseFromManifest; function getManifest() { return __awaiter(this, void 0, void 0, function* () { try { - //const manifestFromRepo = await getManifestFromRepo(); - const manifestFromRepo = { - sha: '5418fd77743bd877e972056787b3ee67a5725566', - node_id: 'MDQ6QmxvYjI1MDA3NzkzMzo1NDE4ZmQ3Nzc0M2JkODc3ZTk3MjA1Njc4N2IzZWU2N2E1NzI1NTY2', - size: 296984, - url: 'https://api.github.com/repos/actions/python-versions/git/blobs/5418fd77743bd877e972056787b3ee67a5725566', - content: 'fasfWfasdkjnflaknc@fakjsdhfjlakjlkfj', - encoding: 'base64' - }; + const manifestFromRepo = yield getManifestFromRepo(); core.info('Successfully fetched the manifest from the repo.'); core.info(`Manifest from repo: ${JSON.stringify(manifestFromRepo)}`); - if (!Array.isArray(manifestFromRepo) || - !manifestFromRepo.every(isValidManifestEntry)) { - throw new Error('Invalid response'); - } + validateManifest(manifestFromRepo); return manifestFromRepo; } catch (err) { - core.info('Fetching the manifest via the API failed.'); - if (err instanceof Error) { - core.info(err.message); - } + logError('Fetching the manifest via the API failed.', err); } try { const manifestFromURL = yield getManifestFromURL(); @@ -91678,16 +91663,18 @@ function getManifest() { return manifestFromURL; } catch (err) { - core.info('Fetching the manifest from the URL failed.'); - if (err instanceof Error) { - core.info(err.message); - } + logError('Fetching the manifest via the URL failed.', err); // Rethrow the error or return a default value throw new Error('Failed to fetch the manifest from both the repo and the URL.'); } }); } exports.getManifest = getManifest; +function validateManifest(manifest) { + if (!Array.isArray(manifest) || !manifest.every(isValidManifestEntry)) { + throw new Error('Invalid manifest response'); + } +} function isValidManifestEntry(entry) { return (typeof entry.version === 'string' && typeof entry.stable === 'boolean' && @@ -91735,34 +91722,29 @@ function installPython(workingDirectory) { } } }; - if (utils_1.IS_WINDOWS) { - yield exec.exec('powershell', ['./setup.ps1'], options); - } - else { - yield exec.exec('bash', ['./setup.sh'], options); - } + const script = utils_1.IS_WINDOWS ? 'powershell ./setup.ps1' : 'bash ./setup.sh'; + yield exec.exec(script, [], options); }); } function installCpythonFromRelease(release) { return __awaiter(this, void 0, void 0, function* () { const downloadUrl = release.files[0].download_url; core.info(`Download from "${downloadUrl}"`); - let pythonPath = ''; try { const fileName = (0, utils_1.getDownloadFileName)(downloadUrl); - pythonPath = yield tc.downloadTool(downloadUrl, fileName, AUTH); + const pythonPath = yield tc.downloadTool(downloadUrl, fileName, AUTH); core.info('Extract downloaded archive'); - let pythonExtractedFolder; - if (utils_1.IS_WINDOWS) { - pythonExtractedFolder = yield tc.extractZip(pythonPath); - } - else { - pythonExtractedFolder = yield tc.extractTar(pythonPath); - } + const pythonExtractedFolder = utils_1.IS_WINDOWS + ? yield tc.extractZip(pythonPath) + : yield tc.extractTar(pythonPath); core.info('Execute installation script'); yield installPython(pythonExtractedFolder); } catch (err) { + handleDownloadError(err); + throw err; + } + function handleDownloadError(err) { if (err instanceof tc.HTTPError) { // Rate limit? if (err.httpStatusCode === 403 || err.httpStatusCode === 429) { @@ -91775,11 +91757,16 @@ function installCpythonFromRelease(release) { core.debug(err.stack); } } - throw err; } }); } exports.installCpythonFromRelease = installCpythonFromRelease; +function logError(message, err) { + core.info(message); + if (err instanceof Error) { + core.info(err.message); + } +} /***/ }), diff --git a/src/install-python.ts b/src/install-python.ts index 43d7c664..ff8493dd 100644 --- a/src/install-python.ts +++ b/src/install-python.ts @@ -20,7 +20,6 @@ export async function findReleaseFromManifest( ): Promise { if (!manifest) { manifest = await getManifest(); - core.info('manifest :>> ' + JSON.stringify(manifest)); } const foundRelease = await tc.findFromManifest( @@ -35,30 +34,13 @@ export async function findReleaseFromManifest( export async function getManifest(): Promise { try { - //const manifestFromRepo = await getManifestFromRepo(); - const manifestFromRepo = { - sha: '5418fd77743bd877e972056787b3ee67a5725566', - node_id: - 'MDQ6QmxvYjI1MDA3NzkzMzo1NDE4ZmQ3Nzc0M2JkODc3ZTk3MjA1Njc4N2IzZWU2N2E1NzI1NTY2', - size: 296984, - url: 'https://api.github.com/repos/actions/python-versions/git/blobs/5418fd77743bd877e972056787b3ee67a5725566', - content: 'fasfWfasdkjnflaknc@fakjsdhfjlakjlkfj', - encoding: 'base64' - }; + const manifestFromRepo = await getManifestFromRepo(); core.info('Successfully fetched the manifest from the repo.'); core.info(`Manifest from repo: ${JSON.stringify(manifestFromRepo)}`); - if ( - !Array.isArray(manifestFromRepo) || - !manifestFromRepo.every(isValidManifestEntry) - ) { - throw new Error('Invalid response'); - } + validateManifest(manifestFromRepo); return manifestFromRepo; } catch (err) { - core.info('Fetching the manifest via the API failed.'); - if (err instanceof Error) { - core.info(err.message); - } + logError('Fetching the manifest via the API failed.', err); } try { const manifestFromURL = await getManifestFromURL(); @@ -66,10 +48,7 @@ export async function getManifest(): Promise { core.info(`Manifest from URL: ${JSON.stringify(manifestFromURL)}`); return manifestFromURL; } catch (err) { - core.info('Fetching the manifest from the URL failed.'); - if (err instanceof Error) { - core.info(err.message); - } + logError('Fetching the manifest via the URL failed.', err); // Rethrow the error or return a default value throw new Error( 'Failed to fetch the manifest from both the repo and the URL.' @@ -77,6 +56,12 @@ export async function getManifest(): Promise { } } +function validateManifest(manifest: any): void { + if (!Array.isArray(manifest) || !manifest.every(isValidManifestEntry)) { + throw new Error('Invalid manifest response'); + } +} + function isValidManifestEntry(entry: any): boolean { return ( typeof entry.version === 'string' && @@ -139,32 +124,30 @@ async function installPython(workingDirectory: string) { } }; - if (IS_WINDOWS) { - await exec.exec('powershell', ['./setup.ps1'], options); - } else { - await exec.exec('bash', ['./setup.sh'], options); - } + const script = IS_WINDOWS ? 'powershell ./setup.ps1' : 'bash ./setup.sh'; + await exec.exec(script, [], options); } export async function installCpythonFromRelease(release: tc.IToolRelease) { const downloadUrl = release.files[0].download_url; core.info(`Download from "${downloadUrl}"`); - let pythonPath = ''; try { const fileName = getDownloadFileName(downloadUrl); - pythonPath = await tc.downloadTool(downloadUrl, fileName, AUTH); + const pythonPath = await tc.downloadTool(downloadUrl, fileName, AUTH); core.info('Extract downloaded archive'); - let pythonExtractedFolder; - if (IS_WINDOWS) { - pythonExtractedFolder = await tc.extractZip(pythonPath); - } else { - pythonExtractedFolder = await tc.extractTar(pythonPath); - } + const pythonExtractedFolder = IS_WINDOWS + ? await tc.extractZip(pythonPath) + : await tc.extractTar(pythonPath); core.info('Execute installation script'); await installPython(pythonExtractedFolder); } catch (err) { + handleDownloadError(err); + throw err; + } + + function handleDownloadError(err: any): void { if (err instanceof tc.HTTPError) { // Rate limit? if (err.httpStatusCode === 403 || err.httpStatusCode === 429) { @@ -178,6 +161,12 @@ export async function installCpythonFromRelease(release: tc.IToolRelease) { core.debug(err.stack); } } - throw err; + } +} + +function logError(message: string, err: any): void { + core.info(message); + if (err instanceof Error) { + core.info(err.message); } }