mirror of https://github.com/python/cpython
Issue #23399: pyvenv creates relative symlinks where possible.
This commit is contained in:
commit
1670613d48
|
@ -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:
|
||||||
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,7 +185,11 @@ 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!
|
||||||
os.symlink(src, dst)
|
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)
|
||||||
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)
|
||||||
force_copy = True
|
force_copy = True
|
||||||
|
@ -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:
|
||||||
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:
|
||||||
|
|
|
@ -235,6 +235,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #23399: pyvenv creates relative symlinks where possible.
|
||||||
|
|
||||||
- Issue #20289: cgi.FieldStorage() now supports the context management
|
- Issue #20289: cgi.FieldStorage() now supports the context management
|
||||||
protocol.
|
protocol.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue