From b9b965f6dd5be211a9ce047ac00070e51bc9b7a8 Mon Sep 17 00:00:00 2001 From: Vinay Sajip Date: Tue, 3 Jun 2014 16:47:51 +0100 Subject: [PATCH] Issue #21643: Updated test and fixed logic bug in lib64 symlink creation. --- Lib/test/test_venv.py | 27 ++++++++++++++++----------- Lib/venv/__init__.py | 6 +++--- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index e13cd8cf989..8dfff519aa5 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -203,17 +203,22 @@ class BasicTest(BaseTest): """ Test upgrading an existing environment directory. """ - builder = venv.EnvBuilder(upgrade=True) - self.run_with_capture(builder.create, self.env_dir) - self.isdir(self.bindir) - self.isdir(self.include) - self.isdir(*self.lib) - fn = self.get_env_file(self.bindir, self.exe) - if not os.path.exists(fn): # diagnostics for Windows buildbot failures - bd = self.get_env_file(self.bindir) - print('Contents of %r:' % bd) - print(' %r' % os.listdir(bd)) - self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn) + # See Issue #21643: the loop needs to run twice to ensure + # that everything works on the upgrade (the first run just creates + # the venv). + for upgrade in (False, True): + builder = venv.EnvBuilder(upgrade=upgrade) + self.run_with_capture(builder.create, self.env_dir) + self.isdir(self.bindir) + self.isdir(self.include) + self.isdir(*self.lib) + fn = self.get_env_file(self.bindir, self.exe) + if not os.path.exists(fn): + # diagnostics for Windows buildbot failures + bd = self.get_env_file(self.bindir) + print('Contents of %r:' % bd) + print(' %r' % os.listdir(bd)) + self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn) def test_isolation(self): """ diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 252bffbd7be..c258b1c05a4 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -30,7 +30,6 @@ optional arguments: import logging import os import shutil -import struct import subprocess import sys import types @@ -140,11 +139,12 @@ class EnvBuilder: create_if_needed(path) create_if_needed(libpath) # Issue 21197: create lib64 as a symlink to lib on 64-bit non-OS X POSIX - if ((struct.calcsize('P') == 8) and (os.name == 'posix') and + if ((sys.maxsize > 2**32) and (os.name == 'posix') and (sys.platform != 'darwin')): p = os.path.join(env_dir, 'lib') link_path = os.path.join(env_dir, 'lib64') - os.symlink(p, link_path) + if not os.path.exists(link_path): # Issue #21643 + os.symlink(p, link_path) context.bin_path = binpath = os.path.join(env_dir, binname) context.bin_name = binname context.env_exe = os.path.join(binpath, exename)