diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py index 0fe640caee..a59876fcae 100644 --- a/python/mozbuild/mozbuild/configure/__init__.py +++ b/python/mozbuild/mozbuild/configure/__init__.py @@ -192,8 +192,9 @@ class ConfigureSandbox(dict): b: __builtins__[b] for b in ('None', 'False', 'True', 'int', 'bool', 'any', 'all', 'len', 'list', 'tuple', 'set', 'dict', 'isinstance', 'getattr', - 'hasattr', 'enumerate', 'range', 'zip') - }, __import__=forbidden_import, str=unicode) + 'hasattr', 'enumerate', 'range', 'zip', '__build_class__') + if b in __builtins__}, + __import__=forbidden_import, str=unicode) # Expose a limited set of functions from os.path OS = ReadOnlyNamespace(path=ReadOnlyNamespace(**{ diff --git a/python/mozbuild/mozbuild/frontend/sandbox.py b/python/mozbuild/mozbuild/frontend/sandbox.py index 0bf1599f20..3638ec807c 100644 --- a/python/mozbuild/mozbuild/frontend/sandbox.py +++ b/python/mozbuild/mozbuild/frontend/sandbox.py @@ -115,7 +115,10 @@ class Sandbox(dict): def __init__(self, context, builtins=None, finder=default_finder): """Initialize a Sandbox ready for execution. """ - self._builtins = builtins or self.BUILTINS + self._builtins = ReadOnlyDict( + (builtins or self.BUILTINS).viewitems() | + {b: __builtins__[b] for b in ('__build_class__',) + if b in __builtins__}.viewitems()) dict.__setitem__(self, '__builtins__', self._builtins) assert isinstance(self._builtins, ReadOnlyDict) diff --git a/python/virtualenv/site.py b/python/virtualenv/site.py index 4e426cdb66..bf23c19204 100644 --- a/python/virtualenv/site.py +++ b/python/virtualenv/site.py @@ -65,6 +65,7 @@ ImportError exception, it is silently ignored. import sys import os +import platform try: import __builtin__ as builtins @@ -85,11 +86,14 @@ USER_SITE = None USER_BASE = None _is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32 +_is_tauthon = platform.python_implementation() == "Tauthon" _is_pypy = hasattr(sys, 'pypy_version_info') _is_jython = sys.platform[:4] == 'java' if _is_jython: ModuleType = type(os) +_python_libdir = "tauthon" if _is_tauthon else "python" + def makepath(*paths): dir = os.path.join(*paths) if _is_jython and (dir == '__classpath__' or @@ -228,16 +232,16 @@ def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_pre else: # any other Python distros on OSX work this way sitedirs = [os.path.join(prefix, "lib", - "python" + sys.version[:3], "site-packages")] + _python_libdir + sys.version[:3], "site-packages")] elif os.sep == '/': sitedirs = [os.path.join(prefix, "lib", - "python" + sys.version[:3], + _python_libdir + 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") + os.path.join(prefix, _python_libdir + sys.version[:3], "lib-dynload")] + lib64_dir = os.path.join(prefix, "lib64", _python_libdir + 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: @@ -252,15 +256,15 @@ def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_pre pass # Debian-specific dist-packages directories: sitedirs.append(os.path.join(prefix, "local/lib", - "python" + sys.version[:3], + _python_libdir + sys.version[:3], "dist-packages")) if sys.version[0] == '2': sitedirs.append(os.path.join(prefix, "lib", - "python" + sys.version[:3], + _python_libdir + sys.version[:3], "dist-packages")) else: sitedirs.append(os.path.join(prefix, "lib", - "python" + sys.version[0], + _python_libdir + sys.version[0], "dist-packages")) sitedirs.append(os.path.join(prefix, "lib", "dist-python")) else: @@ -583,9 +587,9 @@ def virtual_install_main_packages(): 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])] + paths = [os.path.join(sys.real_prefix, 'lib', _python_libdir + 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]) + lib64_path = os.path.join(sys.real_prefix, 'lib64', _python_libdir + sys.version[:3]) if os.path.exists(lib64_path): if _is_64bit: paths.insert(0, lib64_path) @@ -602,7 +606,7 @@ def virtual_install_main_packages(): # 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], + _python_libdir + sys.version[:3], 'plat-%s' % arch) if os.path.exists(plat_path): paths.append(plat_path) diff --git a/python/virtualenv/virtualenv.py b/python/virtualenv/virtualenv.py index e363021cc1..655e25cf01 100644 --- a/python/virtualenv/virtualenv.py +++ b/python/virtualenv/virtualenv.py @@ -44,13 +44,14 @@ if sys.version_info < (2, 6): print('ERROR: this script requires Python 2.6 or greater.') sys.exit(101) +import platform + try: basestring except NameError: basestring = str -py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1]) - +is_tauthon = platform.python_implementation() == "Tauthon" is_jython = sys.platform.startswith('java') is_pypy = hasattr(sys, 'pypy_version_info') is_win = (sys.platform == 'win32' and os.sep == '\\') @@ -59,6 +60,9 @@ is_msys2 = (sys.platform == 'win32' and os.sep == '/') is_darwin = (sys.platform == 'darwin') abiflags = getattr(sys, 'abiflags', '') +py_version = '%s%s.%s' % ("tauthon" if is_tauthon else "python", + sys.version_info[0], sys.version_info[1]) + user_dir = os.path.expanduser('~') if is_win: default_storage_dir = os.path.join(user_dir, 'virtualenv') @@ -121,7 +125,7 @@ REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath', 'fnmatch', 'locale', 'encodings', 'codecs', 'stat', 'UserDict', 'readline', 'copy_reg', 'types', 're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile', - 'zlib'] + 'zlib', 'platform', 'string'] REQUIRED_FILES = ['lib-dynload', 'config'] @@ -131,6 +135,8 @@ if majver == 2: REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc']) if minver >= 7: REQUIRED_MODULES.extend(['_weakrefset']) + if is_tauthon: + REQUIRED_MODULES.extend(['_oserror']) if is_msys2: REQUIRED_MODULES.extend(['functools']) elif majver == 3: