Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
handled Candidate Not Iterable Error
  • Loading branch information
mahabaleshwars committed Apr 4, 2025
commit 52f4f817a56b0d9a9cd285a42b1ec079c3530848
22 changes: 21 additions & 1 deletion __tests__/install-python.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
29 changes: 27 additions & 2 deletions dist/setup/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -97461,15 +97461,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();
Expand Down
41 changes: 39 additions & 2 deletions src/install-python.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}`;
Expand Down Expand Up @@ -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();
Expand Down