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
Prev Previous commit
Next Next commit
final test commit
  • Loading branch information
mahabaleshwars committed Sep 25, 2024
commit d14839675354c38a6da5d6a50aac18cbf8755827
20 changes: 19 additions & 1 deletion __tests__/install-python.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down
63 changes: 25 additions & 38 deletions dist/setup/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)}`);
Expand All @@ -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();
Expand All @@ -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' &&
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
}
}


/***/ }),
Expand Down
67 changes: 28 additions & 39 deletions src/install-python.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ export async function findReleaseFromManifest(
): Promise<tc.IToolRelease | undefined> {
if (!manifest) {
manifest = await getManifest();
core.info('manifest :>> ' + JSON.stringify(manifest));
}

const foundRelease = await tc.findFromManifest(
Expand All @@ -35,48 +34,34 @@ export async function findReleaseFromManifest(

export async function getManifest(): Promise<tc.IToolRelease[]> {
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();
core.info('Successfully fetched the manifest from the URL.');
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.'
);
}
}

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' &&
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
}
}