From 7c16f92757f60fad1434044385887d6b44256a1d Mon Sep 17 00:00:00 2001 From: mahabaleshwars <147705296+mahabaleshwars@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:32:38 +0530 Subject: [PATCH] handled candidate not iterable error --- __tests__/install-python.test.ts | 22 ++++++++++++++++- dist/setup/index.js | 29 ++++++++++++++++++++-- src/install-python.ts | 41 ++++++++++++++++++++++++++++++-- 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/__tests__/install-python.test.ts b/__tests__/install-python.test.ts index c3a6e7b4..6f1efbd9 100644 --- a/__tests__/install-python.test.ts +++ b/__tests__/install-python.test.ts @@ -8,10 +8,30 @@ import * as tc from '@actions/tool-cache'; jest.mock('@actions/http-client'); jest.mock('@actions/tool-cache'); +jest.mock('@actions/tool-cache', () => ({ + getManifestFromRepo: jest.fn() +})); -const mockManifest = [{version: '1.0.0'}]; +const mockManifest = [ + { + version: '1.0.0', + stable: true, + files: [ + { + filename: 'tool-v1.0.0-linux-x64.tar.gz', + platform: 'linux', + arch: 'x64', + download_url: 'https://example.com/tool-v1.0.0-linux-x64.tar.gz' + } + ] + } +]; describe('getManifest', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + it('should return manifest from repo', async () => { (tc.getManifestFromRepo as jest.Mock).mockResolvedValue(mockManifest); const manifest = await getManifest(); diff --git a/dist/setup/index.js b/dist/setup/index.js index 53196f67..cb969835 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -100156,15 +100156,40 @@ function findReleaseFromManifest(semanticVersionSpec, architecture, manifest) { }); } exports.findReleaseFromManifest = findReleaseFromManifest; +function isIToolRelease(obj) { + return (typeof obj === 'object' && + obj !== null && + typeof obj.version === 'string' && + typeof obj.stable === 'boolean' && + Array.isArray(obj.files) && + obj.files.every((file) => typeof file.filename === 'string' && + typeof file.platform === 'string' && + typeof file.arch === 'string' && + typeof file.download_url === 'string')); +} function getManifest() { return __awaiter(this, void 0, void 0, function* () { try { - return yield getManifestFromRepo(); + const repoManifest = yield getManifestFromRepo(); + core.debug(`Received repo manifest: ${JSON.stringify(repoManifest)}`); + if (Array.isArray(repoManifest) && + repoManifest.length && + repoManifest.every(isIToolRelease)) { + core.debug('Repo manifest is valid and contains IToolRelease items.'); + return repoManifest; + } + else { + core.debug('Repo manifest is invalid or does not contain IToolRelease items.'); + } } catch (err) { core.debug('Fetching the manifest via the API failed.'); if (err instanceof Error) { - core.debug(err.message); + core.debug(`Error message: ${err.message}`); + core.debug(`Error stack: ${err.stack}`); + } + else { + core.debug('Error is not an instance of Error. It might be something else.'); } } return yield getManifestFromURL(); diff --git a/src/install-python.ts b/src/install-python.ts index d3421bf8..75f22d4a 100644 --- a/src/install-python.ts +++ b/src/install-python.ts @@ -5,6 +5,7 @@ import * as exec from '@actions/exec'; import * as httpm from '@actions/http-client'; import {ExecOptions} from '@actions/exec/lib/interfaces'; import {IS_WINDOWS, IS_LINUX, getDownloadFileName} from './utils'; +import {IToolRelease} from '@actions/tool-cache'; const TOKEN = core.getInput('token'); const AUTH = !TOKEN ? undefined : `token ${TOKEN}`; @@ -32,13 +33,49 @@ export async function findReleaseFromManifest( return foundRelease; } +function isIToolRelease(obj: any): obj is IToolRelease { + return ( + typeof obj === 'object' && + obj !== null && + typeof obj.version === 'string' && + typeof obj.stable === 'boolean' && + Array.isArray(obj.files) && + obj.files.every( + (file: any) => + typeof file.filename === 'string' && + typeof file.platform === 'string' && + typeof file.arch === 'string' && + typeof file.download_url === 'string' + ) + ); +} + export async function getManifest(): Promise<tc.IToolRelease[]> { try { - return await getManifestFromRepo(); + const repoManifest = await getManifestFromRepo(); + core.debug(`Received repo manifest: ${JSON.stringify(repoManifest)}`); + + if ( + Array.isArray(repoManifest) && + repoManifest.length && + repoManifest.every(isIToolRelease) + ) { + core.debug('Repo manifest is valid and contains IToolRelease items.'); + return repoManifest; + } else { + core.debug( + 'Repo manifest is invalid or does not contain IToolRelease items.' + ); + } } catch (err) { core.debug('Fetching the manifest via the API failed.'); if (err instanceof Error) { - core.debug(err.message); + core.debug(`Error message: ${err.message}`); + core.debug(`Error stack: ${err.stack}`); + } else { + core.debug( + 'Error is not an instance of Error. It might be something else.' + ); } } return await getManifestFromURL();