Commit 581c29f8 authored by Barry Warsaw's avatar Barry Warsaw

Issue #23399: pyvenv creates relative symlinks where possible.

parent b5181340
...@@ -141,10 +141,9 @@ class EnvBuilder: ...@@ -141,10 +141,9 @@ class EnvBuilder:
# Issue 21197: create lib64 as a symlink to lib on 64-bit non-OS X POSIX # Issue 21197: create lib64 as a symlink to lib on 64-bit non-OS X POSIX
if ((sys.maxsize > 2**32) and (os.name == 'posix') and if ((sys.maxsize > 2**32) and (os.name == 'posix') and
(sys.platform != 'darwin')): (sys.platform != 'darwin')):
p = os.path.join(env_dir, 'lib')
link_path = os.path.join(env_dir, 'lib64') link_path = os.path.join(env_dir, 'lib64')
if not os.path.exists(link_path): # Issue #21643 if not os.path.exists(link_path): # Issue #21643
os.symlink(p, link_path) os.symlink('lib', link_path)
context.bin_path = binpath = os.path.join(env_dir, binname) context.bin_path = binpath = os.path.join(env_dir, binname)
context.bin_name = binname context.bin_name = binname
context.env_exe = os.path.join(binpath, exename) context.env_exe = os.path.join(binpath, exename)
...@@ -178,7 +177,7 @@ class EnvBuilder: ...@@ -178,7 +177,7 @@ class EnvBuilder:
result = f.startswith('python') and f.endswith('.exe') result = f.startswith('python') and f.endswith('.exe')
return result return result
def symlink_or_copy(self, src, dst): def symlink_or_copy(self, src, dst, relative_symlinks_ok=False):
""" """
Try symlinking a file, and if that fails, fall back to copying. Try symlinking a file, and if that fails, fall back to copying.
""" """
...@@ -186,6 +185,10 @@ class EnvBuilder: ...@@ -186,6 +185,10 @@ class EnvBuilder:
if not force_copy: if not force_copy:
try: try:
if not os.path.islink(dst): # can't link to itself! if not os.path.islink(dst): # can't link to itself!
if relative_symlinks_ok:
assert os.path.dirname(src) == os.path.dirname(dst)
os.symlink(os.path.basename(src), dst)
else:
os.symlink(src, dst) os.symlink(src, dst)
except Exception: # may need to use a more specific exception except Exception: # may need to use a more specific exception
logger.warning('Unable to symlink %r to %r', src, dst) logger.warning('Unable to symlink %r to %r', src, dst)
...@@ -201,7 +204,6 @@ class EnvBuilder: ...@@ -201,7 +204,6 @@ class EnvBuilder:
being processed. being processed.
""" """
binpath = context.bin_path binpath = context.bin_path
exename = context.python_exe
path = context.env_exe path = context.env_exe
copier = self.symlink_or_copy copier = self.symlink_or_copy
copier(context.executable, path) copier(context.executable, path)
...@@ -214,7 +216,7 @@ class EnvBuilder: ...@@ -214,7 +216,7 @@ class EnvBuilder:
if not os.path.exists(path): if not os.path.exists(path):
# Issue 18807: make copies if # Issue 18807: make copies if
# symlinks are not wanted # symlinks are not wanted
copier(context.env_exe, path) copier(context.env_exe, path, relative_symlinks_ok=True)
if not os.path.islink(path): if not os.path.islink(path):
os.chmod(path, 0o755) os.chmod(path, 0o755)
else: else:
......
...@@ -59,6 +59,8 @@ Core and Builtins ...@@ -59,6 +59,8 @@ Core and Builtins
Library Library
------- -------
- Issue #23399: pyvenv creates relative symlinks where possible.
- Issue #23099: Closing io.BytesIO with exported buffer is rejected now to - Issue #23099: Closing io.BytesIO with exported buffer is rejected now to
prevent corrupting exported buffer. prevent corrupting exported buffer.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment