You've already forked setup-python
							
							
				mirror of
				https://github.com/actions/setup-python.git
				synced 2025-11-04 16:56:40 +07:00 
			
		
		
		
	Fix: Add .zip extension to Windows package downloads for Expand-Archive Compatibility (#916)
				
					
				
			* Fix: specify filename during Windows package download * Changed unit test download urls
This commit is contained in:
		@ -12,7 +12,9 @@ import {
 | 
			
		||||
  getVersionInputFromFile,
 | 
			
		||||
  getVersionInputFromPlainFile,
 | 
			
		||||
  getVersionInputFromTomlFile,
 | 
			
		||||
  getNextPageUrl
 | 
			
		||||
  getNextPageUrl,
 | 
			
		||||
  IS_WINDOWS,
 | 
			
		||||
  getDownloadFileName
 | 
			
		||||
} from '../src/utils';
 | 
			
		||||
 | 
			
		||||
jest.mock('@actions/cache');
 | 
			
		||||
@ -159,3 +161,37 @@ describe('getNextPageUrl', () => {
 | 
			
		||||
    expect(getNextPageUrl(generateResponse(page2Links))).toBeNull();
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
describe('getDownloadFileName', () => {
 | 
			
		||||
  const originalEnv = process.env;
 | 
			
		||||
  const tempDir = path.join(__dirname, 'runner', 'temp');
 | 
			
		||||
 | 
			
		||||
  beforeEach(() => {
 | 
			
		||||
    process.env = {...originalEnv};
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  afterEach(() => {
 | 
			
		||||
    process.env = originalEnv;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should return the correct path on Windows', () => {
 | 
			
		||||
    if (IS_WINDOWS) {
 | 
			
		||||
      process.env['RUNNER_TEMP'] = tempDir;
 | 
			
		||||
      const downloadUrl =
 | 
			
		||||
        'https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-win32-x64.zip';
 | 
			
		||||
      const expectedPath = path.join(
 | 
			
		||||
        process.env.RUNNER_TEMP,
 | 
			
		||||
        path.basename(downloadUrl)
 | 
			
		||||
      );
 | 
			
		||||
      expect(getDownloadFileName(downloadUrl)).toBe(expectedPath);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should return undefined on non-Windows', () => {
 | 
			
		||||
    if (!IS_WINDOWS) {
 | 
			
		||||
      const downloadUrl =
 | 
			
		||||
        'https://github.com/actions/sometool/releases/tag/1.2.3-20200402.6/sometool-1.2.3-linux-x64.tar.gz';
 | 
			
		||||
      expect(getDownloadFileName(downloadUrl)).toBeUndefined();
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							@ -91441,7 +91441,8 @@ function installPyPy(pypyVersion, pythonVersion, architecture, allowPreReleases,
 | 
			
		||||
        const downloadUrl = `${foundAsset.download_url}`;
 | 
			
		||||
        core.info(`Downloading PyPy from "${downloadUrl}" ...`);
 | 
			
		||||
        try {
 | 
			
		||||
            const pypyPath = yield tc.downloadTool(downloadUrl);
 | 
			
		||||
            const fileName = (0, utils_1.getDownloadFileName)(downloadUrl);
 | 
			
		||||
            const pypyPath = yield tc.downloadTool(downloadUrl, fileName);
 | 
			
		||||
            core.info('Extracting downloaded archive...');
 | 
			
		||||
            if (utils_1.IS_WINDOWS) {
 | 
			
		||||
                downloadDir = yield tc.extractZip(pypyPath);
 | 
			
		||||
@ -91703,7 +91704,8 @@ function installCpythonFromRelease(release) {
 | 
			
		||||
        core.info(`Download from "${downloadUrl}"`);
 | 
			
		||||
        let pythonPath = '';
 | 
			
		||||
        try {
 | 
			
		||||
            pythonPath = yield tc.downloadTool(downloadUrl, undefined, AUTH);
 | 
			
		||||
            const fileName = (0, utils_1.getDownloadFileName)(downloadUrl);
 | 
			
		||||
            pythonPath = yield tc.downloadTool(downloadUrl, fileName, AUTH);
 | 
			
		||||
            core.info('Extract downloaded archive');
 | 
			
		||||
            let pythonExtractedFolder;
 | 
			
		||||
            if (utils_1.IS_WINDOWS) {
 | 
			
		||||
@ -91938,7 +91940,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 | 
			
		||||
    return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
			
		||||
exports.getNextPageUrl = exports.getBinaryDirectory = exports.getVersionInputFromFile = exports.getVersionInputFromPlainFile = exports.getVersionInputFromTomlFile = exports.getOSInfo = exports.getLinuxInfo = exports.logWarning = exports.isCacheFeatureAvailable = exports.isGhes = exports.validatePythonVersionFormatForPyPy = exports.writeExactPyPyVersionFile = exports.readExactPyPyVersionFile = exports.getPyPyVersionFromPath = exports.isNightlyKeyword = exports.validateVersion = exports.createSymlinkInFolder = exports.WINDOWS_PLATFORMS = exports.WINDOWS_ARCHS = exports.IS_MAC = exports.IS_LINUX = exports.IS_WINDOWS = void 0;
 | 
			
		||||
exports.getDownloadFileName = exports.getNextPageUrl = exports.getBinaryDirectory = exports.getVersionInputFromFile = exports.getVersionInputFromPlainFile = exports.getVersionInputFromTomlFile = exports.getOSInfo = exports.getLinuxInfo = exports.logWarning = exports.isCacheFeatureAvailable = exports.isGhes = exports.validatePythonVersionFormatForPyPy = exports.writeExactPyPyVersionFile = exports.readExactPyPyVersionFile = exports.getPyPyVersionFromPath = exports.isNightlyKeyword = exports.validateVersion = exports.createSymlinkInFolder = exports.WINDOWS_PLATFORMS = exports.WINDOWS_ARCHS = exports.IS_MAC = exports.IS_LINUX = exports.IS_WINDOWS = void 0;
 | 
			
		||||
/* eslint no-unsafe-finally: "off" */
 | 
			
		||||
const cache = __importStar(__nccwpck_require__(7799));
 | 
			
		||||
const core = __importStar(__nccwpck_require__(2186));
 | 
			
		||||
@ -92198,6 +92200,20 @@ function getNextPageUrl(response) {
 | 
			
		||||
    return null;
 | 
			
		||||
}
 | 
			
		||||
exports.getNextPageUrl = getNextPageUrl;
 | 
			
		||||
/**
 | 
			
		||||
 * Add temporary fix for Windows
 | 
			
		||||
 * On Windows, it is necessary to retain the .zip extension for proper extraction.
 | 
			
		||||
 * because the tc.extractZip() failure due to tc.downloadTool() not adding .zip extension.
 | 
			
		||||
 * Related issue: https://github.com/actions/toolkit/issues/1179
 | 
			
		||||
 * Related issue: https://github.com/actions/setup-python/issues/819
 | 
			
		||||
 */
 | 
			
		||||
function getDownloadFileName(downloadUrl) {
 | 
			
		||||
    const tempDir = process.env.RUNNER_TEMP || '.';
 | 
			
		||||
    return exports.IS_WINDOWS
 | 
			
		||||
        ? path.join(tempDir, path.basename(downloadUrl))
 | 
			
		||||
        : undefined;
 | 
			
		||||
}
 | 
			
		||||
exports.getDownloadFileName = getDownloadFileName;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,8 @@ import {
 | 
			
		||||
  createSymlinkInFolder,
 | 
			
		||||
  isNightlyKeyword,
 | 
			
		||||
  writeExactPyPyVersionFile,
 | 
			
		||||
  getBinaryDirectory
 | 
			
		||||
  getBinaryDirectory,
 | 
			
		||||
  getDownloadFileName
 | 
			
		||||
} from './utils';
 | 
			
		||||
 | 
			
		||||
export async function installPyPy(
 | 
			
		||||
@ -69,7 +70,8 @@ export async function installPyPy(
 | 
			
		||||
  core.info(`Downloading PyPy from "${downloadUrl}" ...`);
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    const pypyPath = await tc.downloadTool(downloadUrl);
 | 
			
		||||
    const fileName = getDownloadFileName(downloadUrl);
 | 
			
		||||
    const pypyPath = await tc.downloadTool(downloadUrl, fileName);
 | 
			
		||||
 | 
			
		||||
    core.info('Extracting downloaded archive...');
 | 
			
		||||
    if (IS_WINDOWS) {
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ import * as tc from '@actions/tool-cache';
 | 
			
		||||
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} from './utils';
 | 
			
		||||
import {IS_WINDOWS, IS_LINUX, getDownloadFileName} from './utils';
 | 
			
		||||
 | 
			
		||||
const TOKEN = core.getInput('token');
 | 
			
		||||
const AUTH = !TOKEN ? undefined : `token ${TOKEN}`;
 | 
			
		||||
@ -98,7 +98,8 @@ export async function installCpythonFromRelease(release: tc.IToolRelease) {
 | 
			
		||||
  core.info(`Download from "${downloadUrl}"`);
 | 
			
		||||
  let pythonPath = '';
 | 
			
		||||
  try {
 | 
			
		||||
    pythonPath = await tc.downloadTool(downloadUrl, undefined, AUTH);
 | 
			
		||||
    const fileName = getDownloadFileName(downloadUrl);
 | 
			
		||||
    pythonPath = await tc.downloadTool(downloadUrl, fileName, AUTH);
 | 
			
		||||
    core.info('Extract downloaded archive');
 | 
			
		||||
    let pythonExtractedFolder;
 | 
			
		||||
    if (IS_WINDOWS) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/utils.ts
									
									
									
									
									
								
							@ -310,3 +310,17 @@ export function getNextPageUrl<T>(response: ifm.TypedResponse<T>) {
 | 
			
		||||
  }
 | 
			
		||||
  return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add temporary fix for Windows
 | 
			
		||||
 * On Windows, it is necessary to retain the .zip extension for proper extraction.
 | 
			
		||||
 * because the tc.extractZip() failure due to tc.downloadTool() not adding .zip extension.
 | 
			
		||||
 * Related issue: https://github.com/actions/toolkit/issues/1179
 | 
			
		||||
 * Related issue: https://github.com/actions/setup-python/issues/819
 | 
			
		||||
 */
 | 
			
		||||
export function getDownloadFileName(downloadUrl: string): string | undefined {
 | 
			
		||||
  const tempDir = process.env.RUNNER_TEMP || '.';
 | 
			
		||||
  return IS_WINDOWS
 | 
			
		||||
    ? path.join(tempDir, path.basename(downloadUrl))
 | 
			
		||||
    : undefined;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user