зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1437593 - Vendor virtualenv 15.2.0; r=gps
MozReview-Commit-ID: 7DL7wU8eUHm --HG-- extra : rebase_source : c50b07b619da144569573175158774f8e22d6bed
This commit is contained in:
Родитель
2d8afe4784
Коммит
bb95f0b4a4
|
@ -1,6 +1,6 @@
|
|||
Metadata-Version: 1.1
|
||||
Name: virtualenv
|
||||
Version: 15.0.1
|
||||
Version: 15.2.0
|
||||
Summary: Virtual Python Environment builder
|
||||
Home-page: https://virtualenv.pypa.io/
|
||||
Author: Jannis Leidel, Carl Meyer and Brian Rosner
|
||||
|
@ -47,29 +47,26 @@ Description: Virtualenv
|
|||
Release History
|
||||
===============
|
||||
|
||||
15.0.1 (2016-03-17)
|
||||
15.2.0 (2018-03-21)
|
||||
-------------------
|
||||
|
||||
* Print error message when DEST_DIR exists and is a file
|
||||
* Upgrade setuptools to 39.0.1.
|
||||
|
||||
* Upgrade setuptools to 20.3
|
||||
* Upgrade pip to 9.0.3.
|
||||
|
||||
* Upgrade pip to 8.1.1.
|
||||
* Upgrade wheel to 0.30.0.
|
||||
|
||||
|
||||
15.0.0 (2016-03-05)
|
||||
15.1.0 (2016-11-15)
|
||||
-------------------
|
||||
|
||||
* Remove the `virtualenv-N.N` script from the package; this can no longer be
|
||||
correctly created from a wheel installation.
|
||||
Resolves #851, #692
|
||||
* Support Python 3.6.
|
||||
|
||||
* Remove accidental runtime dependency on pip by extracting certificate in the
|
||||
subprocess.
|
||||
* Upgrade setuptools to 28.0.0.
|
||||
|
||||
* Upgrade setuptools 20.2.2.
|
||||
* Upgrade pip to 9.0.1.
|
||||
|
||||
* Upgrade pip to 8.1.0.
|
||||
* Don't install pre-release versions of pip, setuptools, or wheel from PyPI.
|
||||
|
||||
|
||||
`Full Changelog <https://virtualenv.pypa.io/en/latest/changes.html>`_.
|
||||
|
@ -82,6 +79,6 @@ Classifier: Programming Language :: Python :: 2
|
|||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.3
|
||||
Classifier: Programming Language :: Python :: 3.4
|
||||
Classifier: Programming Language :: Python :: 3.5
|
||||
Classifier: Programming Language :: Python :: 3.6
|
||||
|
|
|
@ -7,7 +7,13 @@ from __future__ import print_function
|
|||
import os
|
||||
import re
|
||||
import codecs
|
||||
from zlib import crc32
|
||||
from zlib import crc32 as _crc32
|
||||
|
||||
|
||||
def crc32(data):
|
||||
"""Python version idempotent"""
|
||||
return _crc32(data) & 0xffffffff
|
||||
|
||||
|
||||
here = os.path.dirname(__file__)
|
||||
script = os.path.join(here, '..', 'virtualenv.py')
|
||||
|
@ -20,6 +26,7 @@ file_regex = re.compile(
|
|||
re.S)
|
||||
file_template = b'##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
|
||||
|
||||
|
||||
def rebuild(script_path):
|
||||
with open(script_path, 'rb') as f:
|
||||
script_content = f.read()
|
||||
|
@ -42,12 +49,12 @@ def rebuild(script_path):
|
|||
new_data = b64.encode(gzip.encode(embedded)[0])[0]
|
||||
|
||||
if new_data == data:
|
||||
print(' File up to date (crc: %s)' % new_crc)
|
||||
print(' File up to date (crc: %08x)' % new_crc)
|
||||
parts += [match.group(0)]
|
||||
continue
|
||||
# Else: content has changed
|
||||
crc = crc32(gzip.decode(b64.decode(data)[0])[0])
|
||||
print(' Content changed (crc: %s -> %s)' %
|
||||
print(' Content changed (crc: %08x -> %08x)' %
|
||||
(crc, new_crc))
|
||||
new_match = file_template % {
|
||||
b'filename': filename,
|
||||
|
|
|
@ -1,6 +1,50 @@
|
|||
Release History
|
||||
===============
|
||||
|
||||
15.2.0 (2018-03-21)
|
||||
-------------------
|
||||
|
||||
* Upgrade setuptools to 39.0.1.
|
||||
|
||||
* Upgrade pip to 9.0.3.
|
||||
|
||||
* Upgrade wheel to 0.30.0.
|
||||
|
||||
|
||||
15.1.0 (2016-11-15)
|
||||
-------------------
|
||||
|
||||
* Support Python 3.6.
|
||||
|
||||
* Upgrade setuptools to 28.0.0.
|
||||
|
||||
* Upgrade pip to 9.0.1.
|
||||
|
||||
* Don't install pre-release versions of pip, setuptools, or wheel from PyPI.
|
||||
|
||||
|
||||
15.0.3 (2016-08-05)
|
||||
-------------------
|
||||
|
||||
* Test for given python path actually being an executable *file*, :issue:`939`
|
||||
|
||||
* Only search for copy actual existing Tcl/Tk directories (:pull:`937`)
|
||||
|
||||
* Generically search for correct Tcl/Tk version (:pull:`926`, :pull:`933`)
|
||||
|
||||
* Upgrade setuptools to 22.0.5
|
||||
|
||||
15.0.2 (2016-05-28)
|
||||
-------------------
|
||||
|
||||
* Copy Tcl/Tk libs on Windows to allow them to run,
|
||||
fixes :issue:`93` (:pull:`888`)
|
||||
|
||||
* Upgrade setuptools to 21.2.1.
|
||||
|
||||
* Upgrade pip to 8.1.2.
|
||||
|
||||
|
||||
15.0.1 (2016-03-17)
|
||||
-------------------
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ changes any file in `virtualenv_embedded/`, run `bin/rebuild-script.py` to
|
|||
update the embedded version of that file in `virtualenv.py`; commit that and
|
||||
submit it as part of your patch / pull request.
|
||||
|
||||
.. _pip development: http://www.pip-installer.org/en/latest/development.html
|
||||
.. _pip development: https://pip.pypa.io/en/latest/development/
|
||||
.. _virtualenv repo: https://github.com/pypa/virtualenv/
|
||||
|
||||
Running the tests
|
||||
|
|
|
@ -27,7 +27,7 @@ Or to get the latest unreleased dev version:
|
|||
|
||||
::
|
||||
|
||||
$ [sudo] pip install https://github.com/pypa/virtualenv/tarball/develop
|
||||
$ [sudo] pip install https://github.com/pypa/virtualenv/tarball/master
|
||||
|
||||
|
||||
To install version X.X globally from source:
|
||||
|
|
|
@ -112,7 +112,7 @@ below.
|
|||
If you select ``[A] Always Run``, the certificate will be added to the
|
||||
Trusted Publishers of your user account, and will be trusted in this
|
||||
user's context henceforth. If you select ``[R] Run Once``, the script will
|
||||
be run, but you will be prometed on a subsequent invocation. Advanced users
|
||||
be run, but you will be prompted on a subsequent invocation. Advanced users
|
||||
can add the signer's certificate to the Trusted Publishers of the Computer
|
||||
account to apply to all users (though this technique is out of scope of this
|
||||
document).
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
universal = 1
|
||||
|
||||
[egg_info]
|
||||
tag_date = 0
|
||||
tag_build =
|
||||
tag_svn_revision = 0
|
||||
tag_date = 0
|
||||
|
||||
|
|
|
@ -106,9 +106,9 @@ setup(
|
|||
'Programming Language :: Python :: 2.6',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.3',
|
||||
'Programming Language :: Python :: 3.4',
|
||||
'Programming Language :: Python :: 3.5',
|
||||
'Programming Language :: Python :: 3.6',
|
||||
],
|
||||
keywords='setuptools deployment installation distutils',
|
||||
author='Ian Bicking',
|
||||
|
|
|
@ -1,760 +0,0 @@
|
|||
"""Append module search paths for third-party packages to sys.path.
|
||||
|
||||
****************************************************************
|
||||
* This module is automatically imported during initialization. *
|
||||
****************************************************************
|
||||
|
||||
In earlier versions of Python (up to 1.5a3), scripts or modules that
|
||||
needed to use site-specific modules would place ``import site''
|
||||
somewhere near the top of their code. Because of the automatic
|
||||
import, this is no longer necessary (but code that does it still
|
||||
works).
|
||||
|
||||
This will append site-specific paths to the module search path. On
|
||||
Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
|
||||
appends lib/python<version>/site-packages as well as lib/site-python.
|
||||
It also supports the Debian convention of
|
||||
lib/python<version>/dist-packages. On other platforms (mainly Mac and
|
||||
Windows), it uses just sys.prefix (and sys.exec_prefix, if different,
|
||||
but this is unlikely). The resulting directories, if they exist, are
|
||||
appended to sys.path, and also inspected for path configuration files.
|
||||
|
||||
FOR DEBIAN, this sys.path is augmented with directories in /usr/local.
|
||||
Local addons go into /usr/local/lib/python<version>/site-packages
|
||||
(resp. /usr/local/lib/site-python), Debian addons install into
|
||||
/usr/{lib,share}/python<version>/dist-packages.
|
||||
|
||||
A path configuration file is a file whose name has the form
|
||||
<package>.pth; its contents are additional directories (one per line)
|
||||
to be added to sys.path. Non-existing directories (or
|
||||
non-directories) are never added to sys.path; no directory is added to
|
||||
sys.path more than once. Blank lines and lines beginning with
|
||||
'#' are skipped. Lines starting with 'import' are executed.
|
||||
|
||||
For example, suppose sys.prefix and sys.exec_prefix are set to
|
||||
/usr/local and there is a directory /usr/local/lib/python2.X/site-packages
|
||||
with three subdirectories, foo, bar and spam, and two path
|
||||
configuration files, foo.pth and bar.pth. Assume foo.pth contains the
|
||||
following:
|
||||
|
||||
# foo package configuration
|
||||
foo
|
||||
bar
|
||||
bletch
|
||||
|
||||
and bar.pth contains:
|
||||
|
||||
# bar package configuration
|
||||
bar
|
||||
|
||||
Then the following directories are added to sys.path, in this order:
|
||||
|
||||
/usr/local/lib/python2.X/site-packages/bar
|
||||
/usr/local/lib/python2.X/site-packages/foo
|
||||
|
||||
Note that bletch is omitted because it doesn't exist; bar precedes foo
|
||||
because bar.pth comes alphabetically before foo.pth; and spam is
|
||||
omitted because it is not mentioned in either path configuration file.
|
||||
|
||||
After these path manipulations, an attempt is made to import a module
|
||||
named sitecustomize, which can perform arbitrary additional
|
||||
site-specific customizations. If this import fails with an
|
||||
ImportError exception, it is silently ignored.
|
||||
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
try:
|
||||
import __builtin__ as builtins
|
||||
except ImportError:
|
||||
import builtins
|
||||
try:
|
||||
set
|
||||
except NameError:
|
||||
from sets import Set as set
|
||||
|
||||
# Prefixes for site-packages; add additional prefixes like /usr/local here
|
||||
PREFIXES = [sys.prefix, sys.exec_prefix]
|
||||
# Enable per user site-packages directory
|
||||
# set it to False to disable the feature or True to force the feature
|
||||
ENABLE_USER_SITE = None
|
||||
# for distutils.commands.install
|
||||
USER_SITE = None
|
||||
USER_BASE = None
|
||||
|
||||
_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32
|
||||
_is_pypy = hasattr(sys, 'pypy_version_info')
|
||||
_is_jython = sys.platform[:4] == 'java'
|
||||
if _is_jython:
|
||||
ModuleType = type(os)
|
||||
|
||||
def makepath(*paths):
|
||||
dir = os.path.join(*paths)
|
||||
if _is_jython and (dir == '__classpath__' or
|
||||
dir.startswith('__pyclasspath__')):
|
||||
return dir, dir
|
||||
dir = os.path.abspath(dir)
|
||||
return dir, os.path.normcase(dir)
|
||||
|
||||
def abs__file__():
|
||||
"""Set all module' __file__ attribute to an absolute path"""
|
||||
for m in sys.modules.values():
|
||||
if ((_is_jython and not isinstance(m, ModuleType)) or
|
||||
hasattr(m, '__loader__')):
|
||||
# only modules need the abspath in Jython. and don't mess
|
||||
# with a PEP 302-supplied __file__
|
||||
continue
|
||||
f = getattr(m, '__file__', None)
|
||||
if f is None:
|
||||
continue
|
||||
m.__file__ = os.path.abspath(f)
|
||||
|
||||
def removeduppaths():
|
||||
""" Remove duplicate entries from sys.path along with making them
|
||||
absolute"""
|
||||
# This ensures that the initial path provided by the interpreter contains
|
||||
# only absolute pathnames, even if we're running from the build directory.
|
||||
L = []
|
||||
known_paths = set()
|
||||
for dir in sys.path:
|
||||
# Filter out duplicate paths (on case-insensitive file systems also
|
||||
# if they only differ in case); turn relative paths into absolute
|
||||
# paths.
|
||||
dir, dircase = makepath(dir)
|
||||
if not dircase in known_paths:
|
||||
L.append(dir)
|
||||
known_paths.add(dircase)
|
||||
sys.path[:] = L
|
||||
return known_paths
|
||||
|
||||
# XXX This should not be part of site.py, since it is needed even when
|
||||
# using the -S option for Python. See http://www.python.org/sf/586680
|
||||
def addbuilddir():
|
||||
"""Append ./build/lib.<platform> in case we're running in the build dir
|
||||
(especially for Guido :-)"""
|
||||
from distutils.util import get_platform
|
||||
s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
|
||||
if hasattr(sys, 'gettotalrefcount'):
|
||||
s += '-pydebug'
|
||||
s = os.path.join(os.path.dirname(sys.path[-1]), s)
|
||||
sys.path.append(s)
|
||||
|
||||
def _init_pathinfo():
|
||||
"""Return a set containing all existing directory entries from sys.path"""
|
||||
d = set()
|
||||
for dir in sys.path:
|
||||
try:
|
||||
if os.path.isdir(dir):
|
||||
dir, dircase = makepath(dir)
|
||||
d.add(dircase)
|
||||
except TypeError:
|
||||
continue
|
||||
return d
|
||||
|
||||
def addpackage(sitedir, name, known_paths):
|
||||
"""Add a new path to known_paths by combining sitedir and 'name' or execute
|
||||
sitedir if it starts with 'import'"""
|
||||
if known_paths is None:
|
||||
_init_pathinfo()
|
||||
reset = 1
|
||||
else:
|
||||
reset = 0
|
||||
fullname = os.path.join(sitedir, name)
|
||||
try:
|
||||
f = open(fullname, "rU")
|
||||
except IOError:
|
||||
return
|
||||
try:
|
||||
for line in f:
|
||||
if line.startswith("#"):
|
||||
continue
|
||||
if line.startswith("import"):
|
||||
exec(line)
|
||||
continue
|
||||
line = line.rstrip()
|
||||
dir, dircase = makepath(sitedir, line)
|
||||
if not dircase in known_paths and os.path.exists(dir):
|
||||
sys.path.append(dir)
|
||||
known_paths.add(dircase)
|
||||
finally:
|
||||
f.close()
|
||||
if reset:
|
||||
known_paths = None
|
||||
return known_paths
|
||||
|
||||
def addsitedir(sitedir, known_paths=None):
|
||||
"""Add 'sitedir' argument to sys.path if missing and handle .pth files in
|
||||
'sitedir'"""
|
||||
if known_paths is None:
|
||||
known_paths = _init_pathinfo()
|
||||
reset = 1
|
||||
else:
|
||||
reset = 0
|
||||
sitedir, sitedircase = makepath(sitedir)
|
||||
if not sitedircase in known_paths:
|
||||
sys.path.append(sitedir) # Add path component
|
||||
try:
|
||||
names = os.listdir(sitedir)
|
||||
except os.error:
|
||||
return
|
||||
names.sort()
|
||||
for name in names:
|
||||
if name.endswith(os.extsep + "pth"):
|
||||
addpackage(sitedir, name, known_paths)
|
||||
if reset:
|
||||
known_paths = None
|
||||
return known_paths
|
||||
|
||||
def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix):
|
||||
"""Add site-packages (and possibly site-python) to sys.path"""
|
||||
prefixes = [os.path.join(sys_prefix, "local"), sys_prefix]
|
||||
if exec_prefix != sys_prefix:
|
||||
prefixes.append(os.path.join(exec_prefix, "local"))
|
||||
|
||||
for prefix in prefixes:
|
||||
if prefix:
|
||||
if sys.platform in ('os2emx', 'riscos') or _is_jython:
|
||||
sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
|
||||
elif _is_pypy:
|
||||
sitedirs = [os.path.join(prefix, 'site-packages')]
|
||||
elif sys.platform == 'darwin' and prefix == sys_prefix:
|
||||
|
||||
if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python
|
||||
|
||||
sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"),
|
||||
os.path.join(prefix, "Extras", "lib", "python")]
|
||||
|
||||
else: # any other Python distros on OSX work this way
|
||||
sitedirs = [os.path.join(prefix, "lib",
|
||||
"python" + sys.version[:3], "site-packages")]
|
||||
|
||||
elif os.sep == '/':
|
||||
sitedirs = [os.path.join(prefix,
|
||||
"lib",
|
||||
"python" + sys.version[:3],
|
||||
"site-packages"),
|
||||
os.path.join(prefix, "lib", "site-python"),
|
||||
os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
|
||||
lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
|
||||
if (os.path.exists(lib64_dir) and
|
||||
os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]):
|
||||
if _is_64bit:
|
||||
sitedirs.insert(0, lib64_dir)
|
||||
else:
|
||||
sitedirs.append(lib64_dir)
|
||||
try:
|
||||
# sys.getobjects only available in --with-pydebug build
|
||||
sys.getobjects
|
||||
sitedirs.insert(0, os.path.join(sitedirs[0], 'debug'))
|
||||
except AttributeError:
|
||||
pass
|
||||
# Debian-specific dist-packages directories:
|
||||
sitedirs.append(os.path.join(prefix, "local/lib",
|
||||
"python" + sys.version[:3],
|
||||
"dist-packages"))
|
||||
if sys.version[0] == '2':
|
||||
sitedirs.append(os.path.join(prefix, "lib",
|
||||
"python" + sys.version[:3],
|
||||
"dist-packages"))
|
||||
else:
|
||||
sitedirs.append(os.path.join(prefix, "lib",
|
||||
"python" + sys.version[0],
|
||||
"dist-packages"))
|
||||
sitedirs.append(os.path.join(prefix, "lib", "dist-python"))
|
||||
else:
|
||||
sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
|
||||
if sys.platform == 'darwin':
|
||||
# for framework builds *only* we add the standard Apple
|
||||
# locations. Currently only per-user, but /Library and
|
||||
# /Network/Library could be added too
|
||||
if 'Python.framework' in prefix:
|
||||
home = os.environ.get('HOME')
|
||||
if home:
|
||||
sitedirs.append(
|
||||
os.path.join(home,
|
||||
'Library',
|
||||
'Python',
|
||||
sys.version[:3],
|
||||
'site-packages'))
|
||||
for sitedir in sitedirs:
|
||||
if os.path.isdir(sitedir):
|
||||
addsitedir(sitedir, known_paths)
|
||||
return None
|
||||
|
||||
def check_enableusersite():
|
||||
"""Check if user site directory is safe for inclusion
|
||||
|
||||
The function tests for the command line flag (including environment var),
|
||||
process uid/gid equal to effective uid/gid.
|
||||
|
||||
None: Disabled for security reasons
|
||||
False: Disabled by user (command line option)
|
||||
True: Safe and enabled
|
||||
"""
|
||||
if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False):
|
||||
return False
|
||||
|
||||
if hasattr(os, "getuid") and hasattr(os, "geteuid"):
|
||||
# check process uid == effective uid
|
||||
if os.geteuid() != os.getuid():
|
||||
return None
|
||||
if hasattr(os, "getgid") and hasattr(os, "getegid"):
|
||||
# check process gid == effective gid
|
||||
if os.getegid() != os.getgid():
|
||||
return None
|
||||
|
||||
return True
|
||||
|
||||
def addusersitepackages(known_paths):
|
||||
"""Add a per user site-package to sys.path
|
||||
|
||||
Each user has its own python directory with site-packages in the
|
||||
home directory.
|
||||
|
||||
USER_BASE is the root directory for all Python versions
|
||||
|
||||
USER_SITE is the user specific site-packages directory
|
||||
|
||||
USER_SITE/.. can be used for data.
|
||||
"""
|
||||
global USER_BASE, USER_SITE, ENABLE_USER_SITE
|
||||
env_base = os.environ.get("PYTHONUSERBASE", None)
|
||||
|
||||
def joinuser(*args):
|
||||
return os.path.expanduser(os.path.join(*args))
|
||||
|
||||
#if sys.platform in ('os2emx', 'riscos'):
|
||||
# # Don't know what to put here
|
||||
# USER_BASE = ''
|
||||
# USER_SITE = ''
|
||||
if os.name == "nt":
|
||||
base = os.environ.get("APPDATA") or "~"
|
||||
if env_base:
|
||||
USER_BASE = env_base
|
||||
else:
|
||||
USER_BASE = joinuser(base, "Python")
|
||||
USER_SITE = os.path.join(USER_BASE,
|
||||
"Python" + sys.version[0] + sys.version[2],
|
||||
"site-packages")
|
||||
else:
|
||||
if env_base:
|
||||
USER_BASE = env_base
|
||||
else:
|
||||
USER_BASE = joinuser("~", ".local")
|
||||
USER_SITE = os.path.join(USER_BASE, "lib",
|
||||
"python" + sys.version[:3],
|
||||
"site-packages")
|
||||
|
||||
if ENABLE_USER_SITE and os.path.isdir(USER_SITE):
|
||||
addsitedir(USER_SITE, known_paths)
|
||||
if ENABLE_USER_SITE:
|
||||
for dist_libdir in ("lib", "local/lib"):
|
||||
user_site = os.path.join(USER_BASE, dist_libdir,
|
||||
"python" + sys.version[:3],
|
||||
"dist-packages")
|
||||
if os.path.isdir(user_site):
|
||||
addsitedir(user_site, known_paths)
|
||||
return known_paths
|
||||
|
||||
|
||||
|
||||
def setBEGINLIBPATH():
|
||||
"""The OS/2 EMX port has optional extension modules that do double duty
|
||||
as DLLs (and must use the .DLL file extension) for other extensions.
|
||||
The library search path needs to be amended so these will be found
|
||||
during module import. Use BEGINLIBPATH so that these are at the start
|
||||
of the library search path.
|
||||
|
||||
"""
|
||||
dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
|
||||
libpath = os.environ['BEGINLIBPATH'].split(';')
|
||||
if libpath[-1]:
|
||||
libpath.append(dllpath)
|
||||
else:
|
||||
libpath[-1] = dllpath
|
||||
os.environ['BEGINLIBPATH'] = ';'.join(libpath)
|
||||
|
||||
|
||||
def setquit():
|
||||
"""Define new built-ins 'quit' and 'exit'.
|
||||
These are simply strings that display a hint on how to exit.
|
||||
|
||||
"""
|
||||
if os.sep == ':':
|
||||
eof = 'Cmd-Q'
|
||||
elif os.sep == '\\':
|
||||
eof = 'Ctrl-Z plus Return'
|
||||
else:
|
||||
eof = 'Ctrl-D (i.e. EOF)'
|
||||
|
||||
class Quitter(object):
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
def __repr__(self):
|
||||
return 'Use %s() or %s to exit' % (self.name, eof)
|
||||
def __call__(self, code=None):
|
||||
# Shells like IDLE catch the SystemExit, but listen when their
|
||||
# stdin wrapper is closed.
|
||||
try:
|
||||
sys.stdin.close()
|
||||
except:
|
||||
pass
|
||||
raise SystemExit(code)
|
||||
builtins.quit = Quitter('quit')
|
||||
builtins.exit = Quitter('exit')
|
||||
|
||||
|
||||
class _Printer(object):
|
||||
"""interactive prompt objects for printing the license text, a list of
|
||||
contributors and the copyright notice."""
|
||||
|
||||
MAXLINES = 23
|
||||
|
||||
def __init__(self, name, data, files=(), dirs=()):
|
||||
self.__name = name
|
||||
self.__data = data
|
||||
self.__files = files
|
||||
self.__dirs = dirs
|
||||
self.__lines = None
|
||||
|
||||
def __setup(self):
|
||||
if self.__lines:
|
||||
return
|
||||
data = None
|
||||
for dir in self.__dirs:
|
||||
for filename in self.__files:
|
||||
filename = os.path.join(dir, filename)
|
||||
try:
|
||||
fp = open(filename, "rU")
|
||||
data = fp.read()
|
||||
fp.close()
|
||||
break
|
||||
except IOError:
|
||||
pass
|
||||
if data:
|
||||
break
|
||||
if not data:
|
||||
data = self.__data
|
||||
self.__lines = data.split('\n')
|
||||
self.__linecnt = len(self.__lines)
|
||||
|
||||
def __repr__(self):
|
||||
self.__setup()
|
||||
if len(self.__lines) <= self.MAXLINES:
|
||||
return "\n".join(self.__lines)
|
||||
else:
|
||||
return "Type %s() to see the full %s text" % ((self.__name,)*2)
|
||||
|
||||
def __call__(self):
|
||||
self.__setup()
|
||||
prompt = 'Hit Return for more, or q (and Return) to quit: '
|
||||
lineno = 0
|
||||
while 1:
|
||||
try:
|
||||
for i in range(lineno, lineno + self.MAXLINES):
|
||||
print(self.__lines[i])
|
||||
except IndexError:
|
||||
break
|
||||
else:
|
||||
lineno += self.MAXLINES
|
||||
key = None
|
||||
while key is None:
|
||||
try:
|
||||
key = raw_input(prompt)
|
||||
except NameError:
|
||||
key = input(prompt)
|
||||
if key not in ('', 'q'):
|
||||
key = None
|
||||
if key == 'q':
|
||||
break
|
||||
|
||||
def setcopyright():
|
||||
"""Set 'copyright' and 'credits' in __builtin__"""
|
||||
builtins.copyright = _Printer("copyright", sys.copyright)
|
||||
if _is_jython:
|
||||
builtins.credits = _Printer(
|
||||
"credits",
|
||||
"Jython is maintained by the Jython developers (www.jython.org).")
|
||||
elif _is_pypy:
|
||||
builtins.credits = _Printer(
|
||||
"credits",
|
||||
"PyPy is maintained by the PyPy developers: http://pypy.org/")
|
||||
else:
|
||||
builtins.credits = _Printer("credits", """\
|
||||
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
|
||||
for supporting Python development. See www.python.org for more information.""")
|
||||
here = os.path.dirname(os.__file__)
|
||||
builtins.license = _Printer(
|
||||
"license", "See http://www.python.org/%.3s/license.html" % sys.version,
|
||||
["LICENSE.txt", "LICENSE"],
|
||||
[os.path.join(here, os.pardir), here, os.curdir])
|
||||
|
||||
|
||||
class _Helper(object):
|
||||
"""Define the built-in 'help'.
|
||||
This is a wrapper around pydoc.help (with a twist).
|
||||
|
||||
"""
|
||||
|
||||
def __repr__(self):
|
||||
return "Type help() for interactive help, " \
|
||||
"or help(object) for help about object."
|
||||
def __call__(self, *args, **kwds):
|
||||
import pydoc
|
||||
return pydoc.help(*args, **kwds)
|
||||
|
||||
def sethelper():
|
||||
builtins.help = _Helper()
|
||||
|
||||
def aliasmbcs():
|
||||
"""On Windows, some default encodings are not provided by Python,
|
||||
while they are always available as "mbcs" in each locale. Make
|
||||
them usable by aliasing to "mbcs" in such a case."""
|
||||
if sys.platform == 'win32':
|
||||
import locale, codecs
|
||||
enc = locale.getdefaultlocale()[1]
|
||||
if enc.startswith('cp'): # "cp***" ?
|
||||
try:
|
||||
codecs.lookup(enc)
|
||||
except LookupError:
|
||||
import encodings
|
||||
encodings._cache[enc] = encodings._unknown
|
||||
encodings.aliases.aliases[enc] = 'mbcs'
|
||||
|
||||
def setencoding():
|
||||
"""Set the string encoding used by the Unicode implementation. The
|
||||
default is 'ascii', but if you're willing to experiment, you can
|
||||
change this."""
|
||||
encoding = "ascii" # Default value set by _PyUnicode_Init()
|
||||
if 0:
|
||||
# Enable to support locale aware default string encodings.
|
||||
import locale
|
||||
loc = locale.getdefaultlocale()
|
||||
if loc[1]:
|
||||
encoding = loc[1]
|
||||
if 0:
|
||||
# Enable to switch off string to Unicode coercion and implicit
|
||||
# Unicode to string conversion.
|
||||
encoding = "undefined"
|
||||
if encoding != "ascii":
|
||||
# On Non-Unicode builds this will raise an AttributeError...
|
||||
sys.setdefaultencoding(encoding) # Needs Python Unicode build !
|
||||
|
||||
|
||||
def execsitecustomize():
|
||||
"""Run custom site specific code, if available."""
|
||||
try:
|
||||
import sitecustomize
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
def virtual_install_main_packages():
|
||||
f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt'))
|
||||
sys.real_prefix = f.read().strip()
|
||||
f.close()
|
||||
pos = 2
|
||||
hardcoded_relative_dirs = []
|
||||
if sys.path[0] == '':
|
||||
pos += 1
|
||||
if _is_jython:
|
||||
paths = [os.path.join(sys.real_prefix, 'Lib')]
|
||||
elif _is_pypy:
|
||||
if sys.version_info > (3, 2):
|
||||
cpyver = '%d' % sys.version_info[0]
|
||||
elif sys.pypy_version_info >= (1, 5):
|
||||
cpyver = '%d.%d' % sys.version_info[:2]
|
||||
else:
|
||||
cpyver = '%d.%d.%d' % sys.version_info[:3]
|
||||
paths = [os.path.join(sys.real_prefix, 'lib_pypy'),
|
||||
os.path.join(sys.real_prefix, 'lib-python', cpyver)]
|
||||
if sys.pypy_version_info < (1, 9):
|
||||
paths.insert(1, os.path.join(sys.real_prefix,
|
||||
'lib-python', 'modified-%s' % cpyver))
|
||||
hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
|
||||
#
|
||||
# This is hardcoded in the Python executable, but relative to sys.prefix:
|
||||
for path in paths[:]:
|
||||
plat_path = os.path.join(path, 'plat-%s' % sys.platform)
|
||||
if os.path.exists(plat_path):
|
||||
paths.append(plat_path)
|
||||
# MOZ: The MSYS2 and MinGW versions of Python have their main packages in the UNIX directory this checks specifically for the native win32 python
|
||||
elif sys.platform == 'win32' and os.sep == '\\':
|
||||
paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')]
|
||||
else:
|
||||
paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])]
|
||||
hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
|
||||
lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3])
|
||||
if os.path.exists(lib64_path):
|
||||
if _is_64bit:
|
||||
paths.insert(0, lib64_path)
|
||||
else:
|
||||
paths.append(lib64_path)
|
||||
# This is hardcoded in the Python executable, but relative to
|
||||
# sys.prefix. Debian change: we need to add the multiarch triplet
|
||||
# here, which is where the real stuff lives. As per PEP 421, in
|
||||
# Python 3.3+, this lives in sys.implementation, while in Python 2.7
|
||||
# it lives in sys.
|
||||
try:
|
||||
arch = getattr(sys, 'implementation', sys)._multiarch
|
||||
except AttributeError:
|
||||
# This is a non-multiarch aware Python. Fallback to the old way.
|
||||
arch = sys.platform
|
||||
plat_path = os.path.join(sys.real_prefix, 'lib',
|
||||
'python'+sys.version[:3],
|
||||
'plat-%s' % arch)
|
||||
if os.path.exists(plat_path):
|
||||
paths.append(plat_path)
|
||||
# This is hardcoded in the Python executable, but
|
||||
# relative to sys.prefix, so we have to fix up:
|
||||
for path in list(paths):
|
||||
tk_dir = os.path.join(path, 'lib-tk')
|
||||
if os.path.exists(tk_dir):
|
||||
paths.append(tk_dir)
|
||||
|
||||
# These are hardcoded in the Apple's Python executable,
|
||||
# but relative to sys.prefix, so we have to fix them up:
|
||||
if sys.platform == 'darwin':
|
||||
hardcoded_paths = [os.path.join(relative_dir, module)
|
||||
for relative_dir in hardcoded_relative_dirs
|
||||
for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')]
|
||||
|
||||
for path in hardcoded_paths:
|
||||
if os.path.exists(path):
|
||||
paths.append(path)
|
||||
|
||||
sys.path.extend(paths)
|
||||
|
||||
def force_global_eggs_after_local_site_packages():
|
||||
"""
|
||||
Force easy_installed eggs in the global environment to get placed
|
||||
in sys.path after all packages inside the virtualenv. This
|
||||
maintains the "least surprise" result that packages in the
|
||||
virtualenv always mask global packages, never the other way
|
||||
around.
|
||||
|
||||
"""
|
||||
egginsert = getattr(sys, '__egginsert', 0)
|
||||
for i, path in enumerate(sys.path):
|
||||
if i > egginsert and path.startswith(sys.prefix):
|
||||
egginsert = i
|
||||
sys.__egginsert = egginsert + 1
|
||||
|
||||
def virtual_addsitepackages(known_paths):
|
||||
force_global_eggs_after_local_site_packages()
|
||||
return addsitepackages(known_paths, sys_prefix=sys.real_prefix)
|
||||
|
||||
def fixclasspath():
|
||||
"""Adjust the special classpath sys.path entries for Jython. These
|
||||
entries should follow the base virtualenv lib directories.
|
||||
"""
|
||||
paths = []
|
||||
classpaths = []
|
||||
for path in sys.path:
|
||||
if path == '__classpath__' or path.startswith('__pyclasspath__'):
|
||||
classpaths.append(path)
|
||||
else:
|
||||
paths.append(path)
|
||||
sys.path = paths
|
||||
sys.path.extend(classpaths)
|
||||
|
||||
def execusercustomize():
|
||||
"""Run custom user specific code, if available."""
|
||||
try:
|
||||
import usercustomize
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
def main():
|
||||
global ENABLE_USER_SITE
|
||||
virtual_install_main_packages()
|
||||
abs__file__()
|
||||
paths_in_sys = removeduppaths()
|
||||
if (os.name == "posix" and sys.path and
|
||||
os.path.basename(sys.path[-1]) == "Modules"):
|
||||
addbuilddir()
|
||||
if _is_jython:
|
||||
fixclasspath()
|
||||
GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt'))
|
||||
if not GLOBAL_SITE_PACKAGES:
|
||||
ENABLE_USER_SITE = False
|
||||
if ENABLE_USER_SITE is None:
|
||||
ENABLE_USER_SITE = check_enableusersite()
|
||||
paths_in_sys = addsitepackages(paths_in_sys)
|
||||
paths_in_sys = addusersitepackages(paths_in_sys)
|
||||
if GLOBAL_SITE_PACKAGES:
|
||||
paths_in_sys = virtual_addsitepackages(paths_in_sys)
|
||||
if sys.platform == 'os2emx':
|
||||
setBEGINLIBPATH()
|
||||
setquit()
|
||||
setcopyright()
|
||||
sethelper()
|
||||
aliasmbcs()
|
||||
setencoding()
|
||||
execsitecustomize()
|
||||
if ENABLE_USER_SITE:
|
||||
execusercustomize()
|
||||
# Remove sys.setdefaultencoding() so that users cannot change the
|
||||
# encoding after initialization. The test for presence is needed when
|
||||
# this module is run as a script, because this code is executed twice.
|
||||
if hasattr(sys, "setdefaultencoding"):
|
||||
del sys.setdefaultencoding
|
||||
|
||||
main()
|
||||
|
||||
def _script():
|
||||
help = """\
|
||||
%s [--user-base] [--user-site]
|
||||
|
||||
Without arguments print some useful information
|
||||
With arguments print the value of USER_BASE and/or USER_SITE separated
|
||||
by '%s'.
|
||||
|
||||
Exit codes with --user-base or --user-site:
|
||||
0 - user site directory is enabled
|
||||
1 - user site directory is disabled by user
|
||||
2 - uses site directory is disabled by super user
|
||||
or for security reasons
|
||||
>2 - unknown error
|
||||
"""
|
||||
args = sys.argv[1:]
|
||||
if not args:
|
||||
print("sys.path = [")
|
||||
for dir in sys.path:
|
||||
print(" %r," % (dir,))
|
||||
print("]")
|
||||
def exists(path):
|
||||
if os.path.isdir(path):
|
||||
return "exists"
|
||||
else:
|
||||
return "doesn't exist"
|
||||
print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE)))
|
||||
print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE)))
|
||||
print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE)
|
||||
sys.exit(0)
|
||||
|
||||
buffer = []
|
||||
if '--user-base' in args:
|
||||
buffer.append(USER_BASE)
|
||||
if '--user-site' in args:
|
||||
buffer.append(USER_SITE)
|
||||
|
||||
if buffer:
|
||||
print(os.pathsep.join(buffer))
|
||||
if ENABLE_USER_SITE:
|
||||
sys.exit(0)
|
||||
elif ENABLE_USER_SITE is False:
|
||||
sys.exit(1)
|
||||
elif ENABLE_USER_SITE is None:
|
||||
sys.exit(2)
|
||||
else:
|
||||
sys.exit(3)
|
||||
else:
|
||||
import textwrap
|
||||
print(textwrap.dedent(help % (sys.argv[0], os.pathsep)))
|
||||
sys.exit(10)
|
||||
|
||||
if __name__ == '__main__':
|
||||
_script()
|
|
@ -25,6 +25,7 @@ def test_resolve_interpreter_with_absolute_path(mock_exists):
|
|||
exe = virtualenv.resolve_interpreter(test_abs_path)
|
||||
|
||||
assert exe == test_abs_path, "Absolute path should return as is"
|
||||
|
||||
mock_exists.assert_called_with(test_abs_path)
|
||||
virtualenv.is_executable.assert_called_with(test_abs_path)
|
||||
|
||||
|
@ -96,6 +97,7 @@ def test_cop_update_defaults_with_store_false():
|
|||
cop.update_defaults(defaults)
|
||||
assert defaults == {'system_site_packages': 0}
|
||||
|
||||
|
||||
def test_install_python_bin():
|
||||
"""Should create the right python executables and links"""
|
||||
tmp_virtualenv = tempfile.mkdtemp()
|
||||
|
@ -106,18 +108,18 @@ def test_install_python_bin():
|
|||
False)
|
||||
|
||||
if virtualenv.is_win:
|
||||
required_executables = [ 'python.exe', 'pythonw.exe']
|
||||
required_executables = ['python.exe', 'pythonw.exe']
|
||||
else:
|
||||
py_exe_no_version = 'python'
|
||||
py_exe_version_major = 'python%s' % sys.version_info[0]
|
||||
py_exe_version_major_minor = 'python%s.%s' % (
|
||||
sys.version_info[0], sys.version_info[1])
|
||||
required_executables = [ py_exe_no_version, py_exe_version_major,
|
||||
py_exe_version_major_minor ]
|
||||
required_executables = [py_exe_no_version, py_exe_version_major,
|
||||
py_exe_version_major_minor]
|
||||
|
||||
for pth in required_executables:
|
||||
assert os.path.exists(os.path.join(bin_dir, pth)), ("%s should "
|
||||
"exist in bin_dir" % pth)
|
||||
assert os.path.exists(os.path.join(bin_dir, pth)), \
|
||||
("%s should exist in bin_dir" % pth)
|
||||
finally:
|
||||
shutil.rmtree(tmp_virtualenv)
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ import logging
|
|||
import zlib
|
||||
import errno
|
||||
import glob
|
||||
import distutils.spawn
|
||||
import distutils.sysconfig
|
||||
import struct
|
||||
import subprocess
|
||||
|
@ -36,7 +37,7 @@ try:
|
|||
except ImportError:
|
||||
import configparser as ConfigParser
|
||||
|
||||
__version__ = "15.0.1"
|
||||
__version__ = "15.2.0"
|
||||
virtualenv_version = __version__ # legacy
|
||||
|
||||
if sys.version_info < (2, 6):
|
||||
|
@ -53,9 +54,8 @@ py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
|
|||
|
||||
is_jython = sys.platform.startswith('java')
|
||||
is_pypy = hasattr(sys, 'pypy_version_info')
|
||||
is_win = (sys.platform == 'win32' and os.sep == '\\')
|
||||
is_win = (sys.platform == 'win32')
|
||||
is_cygwin = (sys.platform == 'cygwin')
|
||||
is_msys2 = (sys.platform == 'win32' and os.sep == '/')
|
||||
is_darwin = (sys.platform == 'darwin')
|
||||
abiflags = getattr(sys, 'abiflags', '')
|
||||
|
||||
|
@ -131,8 +131,6 @@ if majver == 2:
|
|||
REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
|
||||
if minver >= 7:
|
||||
REQUIRED_MODULES.extend(['_weakrefset'])
|
||||
if is_msys2:
|
||||
REQUIRED_MODULES.extend(['functools'])
|
||||
elif majver == 3:
|
||||
# Some extra modules are needed for Python 3, but different ones
|
||||
# for different versions.
|
||||
|
@ -158,12 +156,19 @@ elif majver == 3:
|
|||
'_collections_abc',
|
||||
'_bootlocale',
|
||||
])
|
||||
if minver >= 6:
|
||||
REQUIRED_MODULES.extend(['enum'])
|
||||
|
||||
if is_pypy:
|
||||
# these are needed to correctly display the exceptions that may happen
|
||||
# during the bootstrap
|
||||
REQUIRED_MODULES.extend(['traceback', 'linecache'])
|
||||
|
||||
if majver == 3:
|
||||
# _functools is needed to import locale during stdio initialization and
|
||||
# needs to be copied on PyPy because it's not built in
|
||||
REQUIRED_MODULES.append('_functools')
|
||||
|
||||
|
||||
class Logger(object):
|
||||
|
||||
|
@ -300,7 +305,7 @@ class Logger(object):
|
|||
else:
|
||||
return level >= consumer_level
|
||||
|
||||
#@classmethod
|
||||
@classmethod
|
||||
def level_for_integer(cls, level):
|
||||
levels = cls.LEVELS
|
||||
if level < 0:
|
||||
|
@ -309,8 +314,6 @@ class Logger(object):
|
|||
return levels[-1]
|
||||
return levels[level]
|
||||
|
||||
level_for_integer = classmethod(level_for_integer)
|
||||
|
||||
# create a silent logger just to prevent this from being undefined
|
||||
# will be overridden with requested verbosity main() is called.
|
||||
logger = Logger([(Logger.LEVELS[-1], sys.stdout)])
|
||||
|
@ -536,7 +539,7 @@ def main():
|
|||
'-p', '--python',
|
||||
dest='python',
|
||||
metavar='PYTHON_EXE',
|
||||
help='The Python interpreter to use, e.g., --python=python2.5 will use the python2.5 '
|
||||
help='The Python interpreter to use, e.g., --python=python3.5 will use the python3.5 '
|
||||
'interpreter to create the new environment. The default is the interpreter that '
|
||||
'virtualenv was installed with (%s)' % sys.executable)
|
||||
|
||||
|
@ -567,12 +570,6 @@ def main():
|
|||
default=True,
|
||||
help="Always copy files rather than symlinking.")
|
||||
|
||||
parser.add_option(
|
||||
'--unzip-setuptools',
|
||||
dest='unzip_setuptools',
|
||||
action='store_true',
|
||||
help="Unzip Setuptools when installing it.")
|
||||
|
||||
parser.add_option(
|
||||
'--relocatable',
|
||||
dest='relocatable',
|
||||
|
@ -641,6 +638,11 @@ def main():
|
|||
action='store_true',
|
||||
help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
|
||||
|
||||
parser.add_option(
|
||||
'--unzip-setuptools',
|
||||
action='store_true',
|
||||
help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
|
||||
|
||||
if 'extend_parser' in globals():
|
||||
extend_parser(parser)
|
||||
|
||||
|
@ -701,14 +703,13 @@ def main():
|
|||
create_environment(home_dir,
|
||||
site_packages=options.system_site_packages,
|
||||
clear=options.clear,
|
||||
unzip_setuptools=options.unzip_setuptools,
|
||||
prompt=options.prompt,
|
||||
search_dirs=options.search_dirs,
|
||||
download=options.download,
|
||||
no_setuptools=options.no_setuptools,
|
||||
no_pip=options.no_pip,
|
||||
no_wheel=options.no_wheel,
|
||||
symlink=options.symlink and hasattr(os, 'symlink')) # MOZ: Make sure we don't use symlink when we don't have it
|
||||
symlink=options.symlink)
|
||||
if 'after_install' in globals():
|
||||
after_install(options, home_dir)
|
||||
|
||||
|
@ -857,9 +858,13 @@ def install_wheel(project_names, py_executable, search_dirs=None,
|
|||
import tempfile
|
||||
import os
|
||||
|
||||
import pip
|
||||
try:
|
||||
from pip._internal import main as _main
|
||||
cert_data = pkgutil.get_data("pip._vendor.certifi", "cacert.pem")
|
||||
except ImportError:
|
||||
from pip import main as _main
|
||||
cert_data = pkgutil.get_data("pip._vendor.requests", "cacert.pem")
|
||||
|
||||
cert_data = pkgutil.get_data("pip._vendor.requests", "cacert.pem")
|
||||
if cert_data is not None:
|
||||
cert_file = tempfile.NamedTemporaryFile(delete=False)
|
||||
cert_file.write(cert_data)
|
||||
|
@ -873,7 +878,7 @@ def install_wheel(project_names, py_executable, search_dirs=None,
|
|||
args += ["--cert", cert_file.name]
|
||||
args += sys.argv[1:]
|
||||
|
||||
sys.exit(pip.main(args))
|
||||
sys.exit(_main(args))
|
||||
finally:
|
||||
if cert_file is not None:
|
||||
os.remove(cert_file.name)
|
||||
|
@ -889,7 +894,6 @@ def install_wheel(project_names, py_executable, search_dirs=None,
|
|||
"PIP_FIND_LINKS": findlinks,
|
||||
"PIP_USE_WHEEL": "1",
|
||||
"PIP_ONLY_BINARY": ":all:",
|
||||
"PIP_PRE": "1",
|
||||
"PIP_USER": "0",
|
||||
}
|
||||
|
||||
|
@ -904,7 +908,6 @@ def install_wheel(project_names, py_executable, search_dirs=None,
|
|||
|
||||
|
||||
def create_environment(home_dir, site_packages=False, clear=False,
|
||||
unzip_setuptools=False,
|
||||
prompt=None, search_dirs=None, download=False,
|
||||
no_setuptools=False, no_pip=False, no_wheel=False,
|
||||
symlink=True):
|
||||
|
@ -928,13 +931,19 @@ def create_environment(home_dir, site_packages=False, clear=False,
|
|||
to_install = []
|
||||
|
||||
if not no_setuptools:
|
||||
to_install.append('setuptools')
|
||||
if sys.version_info[:2] == (2, 6):
|
||||
to_install.append('setuptools<37')
|
||||
else:
|
||||
to_install.append('setuptools')
|
||||
|
||||
if not no_pip:
|
||||
to_install.append('pip')
|
||||
|
||||
if not no_wheel:
|
||||
to_install.append('wheel')
|
||||
if sys.version_info[:2] == (2, 6):
|
||||
to_install.append("wheel<0.30")
|
||||
else:
|
||||
to_install.append('wheel')
|
||||
|
||||
if to_install:
|
||||
install_wheel(
|
||||
|
@ -1065,6 +1074,16 @@ def copy_required_modules(dst_prefix, symlink):
|
|||
if os.path.exists(pyfile):
|
||||
copyfile(pyfile, dst_filename[:-1], symlink)
|
||||
|
||||
def copy_tcltk(src, dest, symlink):
|
||||
""" copy tcl/tk libraries on Windows (issue #93) """
|
||||
for libversion in '8.5', '8.6':
|
||||
for libname in 'tcl', 'tk':
|
||||
srcdir = join(src, 'tcl', libname + libversion)
|
||||
destdir = join(dest, 'tcl', libname + libversion)
|
||||
# Only copy the dirs from the above combinations that exist
|
||||
if os.path.exists(srcdir) and not os.path.exists(destdir):
|
||||
copyfileordir(srcdir, destdir, symlink)
|
||||
|
||||
|
||||
def subst_path(prefix_path, prefix, home_dir):
|
||||
prefix_path = os.path.normpath(prefix_path)
|
||||
|
@ -1121,6 +1140,9 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy
|
|||
copy_required_modules(home_dir, symlink)
|
||||
finally:
|
||||
logger.indent -= 2
|
||||
# ...copy tcl/tk
|
||||
if is_win:
|
||||
copy_tcltk(prefix, home_dir, symlink)
|
||||
mkdir(join(lib_dir, 'site-packages'))
|
||||
import site
|
||||
site_filename = site.__file__
|
||||
|
@ -1130,13 +1152,7 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy
|
|||
site_filename = site_filename.replace('$py.class', '.py')
|
||||
site_filename_dst = change_prefix(site_filename, home_dir)
|
||||
site_dir = os.path.dirname(site_filename_dst)
|
||||
# MOZ: Copies a site.py if it exists instead of using the one hex encoded in
|
||||
# this file. Necessary for some site.py fixes for MinGW64 version of python
|
||||
site_py_src_path = os.path.join(os.path.dirname(__file__), 'site.py')
|
||||
if os.path.isfile(site_py_src_path):
|
||||
shutil.copy(site_py_src_path, site_filename_dst)
|
||||
else:
|
||||
writefile(site_filename_dst, SITE_PY)
|
||||
writefile(site_filename_dst, SITE_PY)
|
||||
writefile(join(site_dir, 'orig-prefix.txt'), prefix)
|
||||
site_packages_filename = join(site_dir, 'no-global-site-packages.txt')
|
||||
if not site_packages:
|
||||
|
@ -1235,24 +1251,41 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy
|
|||
elif os.path.exists(python_d_dest):
|
||||
logger.info('Removed python_d.exe as it is no longer at the source')
|
||||
os.unlink(python_d_dest)
|
||||
|
||||
# we need to copy the DLL to enforce that windows will load the correct one.
|
||||
# may not exist if we are cygwin.
|
||||
py_executable_dll = 'python%s%s.dll' % (
|
||||
sys.version_info[0], sys.version_info[1])
|
||||
py_executable_dll_d = 'python%s%s_d.dll' % (
|
||||
sys.version_info[0], sys.version_info[1])
|
||||
pythondll = os.path.join(os.path.dirname(sys.executable), py_executable_dll)
|
||||
pythondll_d = os.path.join(os.path.dirname(sys.executable), py_executable_dll_d)
|
||||
pythondll_d_dest = os.path.join(os.path.dirname(py_executable), py_executable_dll_d)
|
||||
if os.path.exists(pythondll):
|
||||
logger.info('Also created %s' % py_executable_dll)
|
||||
shutil.copyfile(pythondll, os.path.join(os.path.dirname(py_executable), py_executable_dll))
|
||||
if os.path.exists(pythondll_d):
|
||||
logger.info('Also created %s' % py_executable_dll_d)
|
||||
shutil.copyfile(pythondll_d, pythondll_d_dest)
|
||||
elif os.path.exists(pythondll_d_dest):
|
||||
logger.info('Removed %s as the source does not exist' % pythondll_d_dest)
|
||||
os.unlink(pythondll_d_dest)
|
||||
if is_pypy:
|
||||
py_executable_dlls = [
|
||||
(
|
||||
'libpypy-c.dll',
|
||||
'libpypy_d-c.dll',
|
||||
),
|
||||
]
|
||||
else:
|
||||
py_executable_dlls = [
|
||||
(
|
||||
'python%s.dll' % (sys.version_info[0]),
|
||||
'python%s_d.dll' % (sys.version_info[0])
|
||||
),
|
||||
(
|
||||
'python%s%s.dll' % (sys.version_info[0], sys.version_info[1]),
|
||||
'python%s%s_d.dll' % (sys.version_info[0], sys.version_info[1])
|
||||
)
|
||||
]
|
||||
|
||||
for py_executable_dll, py_executable_dll_d in py_executable_dlls:
|
||||
pythondll = os.path.join(os.path.dirname(sys.executable), py_executable_dll)
|
||||
pythondll_d = os.path.join(os.path.dirname(sys.executable), py_executable_dll_d)
|
||||
pythondll_d_dest = os.path.join(os.path.dirname(py_executable), py_executable_dll_d)
|
||||
if os.path.exists(pythondll):
|
||||
logger.info('Also created %s' % py_executable_dll)
|
||||
shutil.copyfile(pythondll, os.path.join(os.path.dirname(py_executable), py_executable_dll))
|
||||
if os.path.exists(pythondll_d):
|
||||
logger.info('Also created %s' % py_executable_dll_d)
|
||||
shutil.copyfile(pythondll_d, pythondll_d_dest)
|
||||
elif os.path.exists(pythondll_d_dest):
|
||||
logger.info('Removed %s as the source does not exist' % pythondll_d_dest)
|
||||
os.unlink(pythondll_d_dest)
|
||||
if is_pypy:
|
||||
# make a symlink python --> pypy-c
|
||||
python_executable = os.path.join(os.path.dirname(py_executable), 'python')
|
||||
|
@ -1262,7 +1295,7 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy
|
|||
copyfile(py_executable, python_executable, symlink)
|
||||
|
||||
if is_win:
|
||||
for name in ['libexpat.dll', 'libpypy.dll', 'libpypy-c.dll',
|
||||
for name in ['libexpat.dll',
|
||||
'libeay32.dll', 'ssleay32.dll', 'sqlite3.dll',
|
||||
'tcl85.dll', 'tk85.dll']:
|
||||
src = join(prefix, name)
|
||||
|
@ -1363,12 +1396,6 @@ def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, sy
|
|||
else:
|
||||
copyfile(py_executable, full_pth, symlink)
|
||||
|
||||
if is_win and ' ' in py_executable:
|
||||
# There's a bug with subprocess on Windows when using a first
|
||||
# argument that has a space in it. Instead we have to quote
|
||||
# the value:
|
||||
py_executable = '"%s"' % py_executable
|
||||
# NOTE: keep this check as one line, cmd.exe doesn't cope with line breaks
|
||||
cmd = [py_executable, '-c', 'import sys;out=sys.stdout;'
|
||||
'getattr(out, "buffer", out).write(sys.prefix.encode("utf-8"))']
|
||||
logger.info('Testing executable with %s %s "%s"' % tuple(cmd))
|
||||
|
@ -1546,27 +1573,24 @@ def resolve_interpreter(exe):
|
|||
"""
|
||||
# If the "executable" is a version number, get the installed executable for
|
||||
# that version
|
||||
orig_exe = exe
|
||||
python_versions = get_installed_pythons()
|
||||
if exe in python_versions:
|
||||
exe = python_versions[exe]
|
||||
|
||||
if os.path.abspath(exe) != exe:
|
||||
paths = os.environ.get('PATH', '').split(os.pathsep)
|
||||
for path in paths:
|
||||
if os.path.exists(join(path, exe)):
|
||||
exe = join(path, exe)
|
||||
break
|
||||
exe = distutils.spawn.find_executable(exe) or exe
|
||||
if not os.path.exists(exe):
|
||||
logger.fatal('The executable %s (from --python=%s) does not exist' % (exe, exe))
|
||||
logger.fatal('The path %s (from --python=%s) does not exist' % (exe, orig_exe))
|
||||
raise SystemExit(3)
|
||||
if not is_executable(exe):
|
||||
logger.fatal('The executable %s (from --python=%s) is not executable' % (exe, exe))
|
||||
logger.fatal('The path %s (from --python=%s) is not an executable file' % (exe, orig_exe))
|
||||
raise SystemExit(3)
|
||||
return exe
|
||||
|
||||
def is_executable(exe):
|
||||
"""Checks a file is executable"""
|
||||
return os.access(exe, os.X_OK)
|
||||
return os.path.isfile(exe) and os.access(exe, os.X_OK)
|
||||
|
||||
############################################################
|
||||
## Relocating the environment:
|
||||
|
@ -1974,21 +1998,21 @@ VzsV75usvTdYef+57v5n1b225qhXfwEmxHEs
|
|||
|
||||
##file activate.fish
|
||||
ACTIVATE_FISH = convert("""
|
||||
eJyFVVFv0zAQfs+vONJO3RDNxCsSQoMVrdK2Vl03CSHkesllMXLsYDvZivjx2GmTOG0YfWhV+7u7
|
||||
73z33Y1gnTENKeMIeakNPCKUGhP7xcQTbCJ4ZOKcxoZV1GCUMp1t4O0zMxkTQEGVQjicO4dTyIwp
|
||||
Ppyfu386Q86jWOZwBhq1ZlK8jYIRXEoQ0jhDYAYSpjA2fBsFQVoKG0UKSLAJB9MEJrMXi6uYMiXl
|
||||
KCrIZYJARQIKTakEGAkmQ+tU5ZSDRTAlRY7CRJMA7GdkgRoNSJ74t1BRxegjR12jWAoGbfpTAeGY
|
||||
LK4vycN8tb6/uCbLi/VVWGPcx3maPr2AO4VjYB+HMAxAkQT/i/ptfbW4vVrczAZit3eHDNqL13n0
|
||||
Ya+w+Tq/uyLL1eJmuSaLh9lqNb/0+IzgznqnAjAvzBa4jG0BNmNXfdJUkxTU2I6xRaKcy+e6VApz
|
||||
WVmoTGFTgwslrYdN03ONrbbMN1E/FQ7H7gOP0UxRjV67TPRBjF3naCMV1mSkYk9MUN7F8cODZzsE
|
||||
iIHYviIe6n8WeGQxWKuhl+9Xa49uijq7fehXMRxT9VR9f/8jhDcfYSKkSOyxKp22cNIrIk+nzd2b
|
||||
Yc7FNpHx8FUn15ZfzXEE98JxZEohx4r6kosCT+R9ZkHQtLmXGYSEeH8JCTvYkcRgXAutp9Rw7Jmf
|
||||
E/J5fktuL25m1tMe3vLdjDt9bNxr2sMo2P3C9BccqGeYhqfQITz6XurXaqdf99LF1mT2YJrvzqCu
|
||||
5w7dKvV3PzNyOb+7+Hw923dOuB+AX2SxrZs9Lm0xbCH6kmhjUyuWw+7cC7DX8367H3VzDz6oBtty
|
||||
tMIeobE21JT6HaRS+TbaoqhbE7rgdGs3xtE4cOF3xo0TfxwsdyRlhUoxuzes18r+Jp88zDx1G+kd
|
||||
/HTrr1BY2CeuyfnbQtAcu9j+pOw6cy9X0k3IuoyKCZPC5ESf6MkgHE5tLiSW3Oa+W2NnrQfkGv/h
|
||||
7tR5PNFnMBlw4B9NJTxnzKA9fLTT0aXSb5vw7FUKzcTZPddqYHi2T9/axJmEEN3qHncVCuEPaFmq
|
||||
uEtpcBj2Z1wjrqGReJBHrY6/go21NA==
|
||||
eJyFVVFv2zYQftevuMoOnBS1gr0WGIZ08RADSRw4boBhGGhGOsUcKFIjKbUu9uN7lC2JsrXWDzZM
|
||||
fnf38e6+uwlsdsJCLiRCUVkHrwiVxYy+hHqDbQKvQl3z1ImaO0xyYXdbeP9FuJ1QwMFUSnmcP4dL
|
||||
2DlXfry+9v/sDqVMUl3AFVi0Vmj1PokmcKtBaecNQTjIhMHUyX0SRXmlKIpWkGEbDuYZzBZfCVcL
|
||||
4youUdVQ6AyBqwwMusoocBrcDsmpKbgEQgijVYHKJbMI6DMhoEUHWmbhLdTcCP4q0TYokYNDev5c
|
||||
QTxlq/tb9rJcbz7f3LOnm81d3GD8x3uav30FfwrnwCEOYRyAKot+FvXPzd3q8W71sBiJ3d2dMugu
|
||||
fsxjCPsBmz+Wz3fsab16eNqw1ctivV7eBnwm8EzeuQIsSrcHqVMqwHbqq8/aarKSO+oYKhKXUn9p
|
||||
SmWw0DVBdQ7bBlwaTR62bc+1tpaYb5PhUyScu48CRgvDLQbtMrMnMQ6dY5022JDRRrwJxWUfJwwP
|
||||
ge0YIAVGfcUC1M8s8MxitFZjmR9W64hui7p4fBlWMZ5y81b/9cvfMbz7FWZKq4yOTeW1hbNBEWU+
|
||||
b+/ejXMu95lOx696uXb8Go4T+Kw8R2EMSqx5KLkkCkQ+ZBZFbZsHL4OYseAvY3EPO5MYTBuhDZQa
|
||||
TwPza8Y+LR/Z483Dgjwd4R3f7bTXx9Znkw6T6PAL83/hRD3jNAKFjuEx9NJkq5t+fabLvdvRwbw4
|
||||
nEFTzwO6U+q34cvY7fL55tP94tg58XEA/q7LfdPsaUXFoEIMJdHF5iSW0+48CnDQ82G7n3XzAD6q
|
||||
Bmo5XuOA0NQ67ir7AXJtQhtLKO7XhC0l39PGOBsHPvzBuHUSjoOnA0ldozGC9gZ5rek3+y3ALHO/
|
||||
kT7AP379lQZLSnFDLtwWihfYxw4nZd+ZR7myfkI2ZTRCuRxmF/bCzkbhcElvYamW9PbDGrvqPKC0
|
||||
+D/uLi/sFcxGjOHylYagZzzsjjhw206RQwrWIwOxS2dnk+40xOjX8bTPegz/gdWVSXuaowNuOLda
|
||||
wYyNuRPSTcd/B48Ppeg=
|
||||
""")
|
||||
|
||||
##file activate.csh
|
||||
|
|
|
@ -64,7 +64,7 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
|||
if test -n "__VIRTUAL_PROMPT__"
|
||||
printf '%s%s' "__VIRTUAL_PROMPT__" (set_color normal)
|
||||
else
|
||||
printf '%s(%s%s%s) ' (set_color normal) (set_color -o white) (basename "$VIRTUAL_ENV") (set_color normal)
|
||||
printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV")
|
||||
end
|
||||
|
||||
# Restore the original $status
|
||||
|
|
Двоичные данные
third_party/python/virtualenv/virtualenv_support/pip-8.1.2-py2.py3-none-any.whl
поставляемый
Двоичные данные
third_party/python/virtualenv/virtualenv_support/pip-8.1.2-py2.py3-none-any.whl
поставляемый
Двоичный файл не отображается.
Двоичные данные
third_party/python/virtualenv/virtualenv_support/pip-9.0.3-py2.py3-none-any.whl
поставляемый
Normal file
Двоичные данные
third_party/python/virtualenv/virtualenv_support/pip-9.0.3-py2.py3-none-any.whl
поставляемый
Normal file
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичные данные
third_party/python/virtualenv/virtualenv_support/setuptools-39.0.1-py2.py3-none-any.whl
поставляемый
Normal file
Двоичные данные
third_party/python/virtualenv/virtualenv_support/setuptools-39.0.1-py2.py3-none-any.whl
поставляемый
Normal file
Двоичный файл не отображается.
Двоичные данные
third_party/python/virtualenv/virtualenv_support/wheel-0.30.0-py2.py3-none-any.whl
поставляемый
Normal file
Двоичные данные
third_party/python/virtualenv/virtualenv_support/wheel-0.30.0-py2.py3-none-any.whl
поставляемый
Normal file
Двоичный файл не отображается.
Загрузка…
Ссылка в новой задаче