Fix pip cache error handling on Windows. (#1040)

* Add error handling for Windows 'pip cache dir' execution

* Add comments
This commit is contained in:
Priya Gupta
2026-06-23 23:31:57 +05:30
committed by GitHub
parent 1d18d7af5f
commit ece7cb06ca
2 changed files with 27 additions and 18 deletions
+14 -9
View File
@@ -54331,24 +54331,29 @@ class PipCache extends cache_distributor_1.default {
this.pythonVersion = pythonVersion; this.pythonVersion = pythonVersion;
} }
async getCacheGlobalDirectories() { async getCacheGlobalDirectories() {
let exitCode = 1; let exitCode = 0;
let stdout = ''; let stdout = '';
let stderr = ''; let stderr = '';
// Add temporary fix for Windows // Add temporary fix for Windows
// On windows it is necessary to execute through an exec // 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, // 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 // or spawn must be started with the shell option enabled for getExecOutput
// Related issue: https://github.com/actions/setup-python/issues/328 // Related issue: https://github.com/actions/setup-python/issues/328
if (utils_1.IS_WINDOWS) { if (utils_1.IS_WINDOWS) {
const execPromisify = util_1.default.promisify(child_process.exec); const execPromisify = util_1.default.promisify(child_process.exec);
({ stdout: stdout, stderr: stderr } = await execPromisify('pip cache dir')); try {
({ stdout, stderr } = await execPromisify('pip cache dir'));
}
catch (err) {
// Pip outputs warnings to stderr (e.g., --no-python-version-warning flag deprecation warning), causing false failure detection
// Related issue: https://github.com/actions/setup-python/issues/1034
// If an error occurs, capture stderr and set exitCode to 1 to indicate failure
stderr = err.stderr ?? err.message;
exitCode = 1;
}
} }
else { else {
({ ({ stdout, stderr, exitCode } = await exec.getExecOutput('pip cache dir'));
stdout: stdout,
stderr: stderr,
exitCode: exitCode
} = await exec.getExecOutput('pip cache dir'));
} }
if (exitCode && stderr) { if (exitCode && stderr) {
throw new Error(`Could not get cache folder path for pip package manager`); throw new Error(`Could not get cache folder path for pip package manager`);
+13 -9
View File
@@ -21,24 +21,28 @@ class PipCache extends CacheDistributor {
} }
protected async getCacheGlobalDirectories() { protected async getCacheGlobalDirectories() {
let exitCode = 1; let exitCode = 0;
let stdout = ''; let stdout = '';
let stderr = ''; let stderr = '';
// Add temporary fix for Windows // Add temporary fix for Windows
// On windows it is necessary to execute through an exec // 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, // 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 // or spawn must be started with the shell option enabled for getExecOutput
// Related issue: https://github.com/actions/setup-python/issues/328 // Related issue: https://github.com/actions/setup-python/issues/328
if (IS_WINDOWS) { if (IS_WINDOWS) {
const execPromisify = utils.promisify(child_process.exec); const execPromisify = utils.promisify(child_process.exec);
({stdout: stdout, stderr: stderr} = await execPromisify('pip cache dir')); try {
({stdout, stderr} = await execPromisify('pip cache dir'));
} catch (err) {
// Pip outputs warnings to stderr (e.g., --no-python-version-warning flag deprecation warning), causing false failure detection
// Related issue: https://github.com/actions/setup-python/issues/1034
// If an error occurs, capture stderr and set exitCode to 1 to indicate failure
stderr = (err as any).stderr ?? (err as Error).message;
exitCode = 1;
}
} else { } else {
({ ({stdout, stderr, exitCode} = await exec.getExecOutput('pip cache dir'));
stdout: stdout,
stderr: stderr,
exitCode: exitCode
} = await exec.getExecOutput('pip cache dir'));
} }
if (exitCode && stderr) { if (exitCode && stderr) {