From 7f80679172b057fc5e90d70d197929d454754a5a Mon Sep 17 00:00:00 2001 From: Dmitry Shibanov Date: Fri, 4 Feb 2022 14:00:41 +0300 Subject: [PATCH] Add fix for Windows caching of pip (#332) --- __tests__/cache-restore.test.ts | 3 ++- dist/setup/index.js | 23 ++++++++++++++++++++++- src/cache-distributions/pip-cache.ts | 26 ++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/__tests__/cache-restore.test.ts b/__tests__/cache-restore.test.ts index d982fd0..6c3b16c 100644 --- a/__tests__/cache-restore.test.ts +++ b/__tests__/cache-restore.test.ts @@ -96,7 +96,8 @@ describe('restore-cache', () => { expect(infoSpy).toHaveBeenCalledWith( `Cache restored from key: setup-python-${process.env['RUNNER_OS']}-python-${pythonVersion}-${packageManager}-${fileHash}` ); - } + }, + 30000 ); it.each([ diff --git a/dist/setup/index.js b/dist/setup/index.js index c129685..a742d58 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -34463,9 +34463,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); const glob = __importStar(__webpack_require__(281)); const core = __importStar(__webpack_require__(470)); const exec = __importStar(__webpack_require__(986)); +const child_process = __importStar(__webpack_require__(129)); +const util_1 = __importDefault(__webpack_require__(669)); const path = __importStar(__webpack_require__(622)); const os_1 = __importDefault(__webpack_require__(87)); const cache_distributor_1 = __importDefault(__webpack_require__(435)); +const utils_1 = __webpack_require__(163); class PipCache extends cache_distributor_1.default { constructor(pythonVersion, cacheDependencyPath = '**/requirements.txt') { super('pip', cacheDependencyPath); @@ -34473,7 +34476,25 @@ class PipCache extends cache_distributor_1.default { } getCacheGlobalDirectories() { return __awaiter(this, void 0, void 0, function* () { - const { stdout, stderr, exitCode } = yield exec.getExecOutput('pip cache dir'); + let exitCode = 1; + let stdout = ''; + let stderr = ''; + // Add temporary fix for Windows + // On windows it is necessary to execute through an exec + // because the getExecOutput gives a non zero code or writes to stderr for pip 22.0.2, + // or spawn must be started with the shell option enabled for getExecOutput + // Related issue: https://github.com/actions/setup-python/issues/328 + if (utils_1.IS_WINDOWS) { + const execPromisify = util_1.default.promisify(child_process.exec); + ({ stdout: stdout, stderr: stderr } = yield execPromisify('pip cache dir')); + } + else { + ({ + stdout: stdout, + stderr: stderr, + exitCode: exitCode + } = yield exec.getExecOutput('pip cache dir')); + } if (exitCode && stderr) { throw new Error(`Could not get cache folder path for pip package manager`); } diff --git a/src/cache-distributions/pip-cache.ts b/src/cache-distributions/pip-cache.ts index f4d7c24..17055ea 100644 --- a/src/cache-distributions/pip-cache.ts +++ b/src/cache-distributions/pip-cache.ts @@ -1,11 +1,13 @@ import * as glob from '@actions/glob'; import * as core from '@actions/core'; import * as exec from '@actions/exec'; - +import * as child_process from 'child_process'; +import utils from 'util'; import * as path from 'path'; import os from 'os'; import CacheDistributor from './cache-distributor'; +import {IS_WINDOWS} from '../utils'; class PipCache extends CacheDistributor { constructor( @@ -16,9 +18,25 @@ class PipCache extends CacheDistributor { } protected async getCacheGlobalDirectories() { - const {stdout, stderr, exitCode} = await exec.getExecOutput( - 'pip cache dir' - ); + let exitCode = 1; + let stdout = ''; + let stderr = ''; + + // Add temporary fix for Windows + // On windows it is necessary to execute through an exec + // because the getExecOutput gives a non zero code or writes to stderr for pip 22.0.2, + // or spawn must be started with the shell option enabled for getExecOutput + // Related issue: https://github.com/actions/setup-python/issues/328 + if (IS_WINDOWS) { + const execPromisify = utils.promisify(child_process.exec); + ({stdout: stdout, stderr: stderr} = await execPromisify('pip cache dir')); + } else { + ({ + stdout: stdout, + stderr: stderr, + exitCode: exitCode + } = await exec.getExecOutput('pip cache dir')); + } if (exitCode && stderr) { throw new Error(