From a509155514f49f9e015f8c83314b39dc6b3c7d58 Mon Sep 17 00:00:00 2001 From: Rmys Date: Tue, 31 Oct 2023 17:03:32 +0300 Subject: [PATCH] tracker-miners-3.6.2 --- game/strategy/0ad/actions.py | 8 +- .../0ad/files/fix_python_3.11_ftbfs.patch | 138 + .../strategy/0ad/files/mozjs_virtualenv.patch | 135904 +++++++++++++++ game/strategy/0ad/pspec.xml | 16 +- util/misc/tracker-miners/pspec.xml | 9 +- 5 files changed, 136070 insertions(+), 5 deletions(-) create mode 100644 game/strategy/0ad/files/fix_python_3.11_ftbfs.patch create mode 100644 game/strategy/0ad/files/mozjs_virtualenv.patch diff --git a/game/strategy/0ad/actions.py b/game/strategy/0ad/actions.py index 308086d860..ac2f389a4a 100644 --- a/game/strategy/0ad/actions.py +++ b/game/strategy/0ad/actions.py @@ -9,7 +9,11 @@ from pisi.actionsapi import shelltools from pisi.actionsapi import get from pisi.actionsapi import pisitools -def setup(): +def setup(): + shelltools.cd("libraries/source/spidermonkey") + shelltools.system("mkdir -p mozjs-78.6.0/.git") + shelltools.cd("../../..") + shelltools.cd("build/workspaces/") shelltools.chmod("update-workspaces.sh", 0755) shelltools.export("WX_CONFIG", "/usr/bin/wxconfig") @@ -34,4 +38,4 @@ def install(): pisitools.insinto("/usr/lib/0ad/", "binaries/system/*.so*") pisitools.insinto("/usr/bin/", "build/resources/0ad.sh") pisitools.insinto("/usr/share/pixmaps/", "build/resources/0ad.png", "0ad.png") - pisitools.insinto("/usr/share/applications/", "build/resources/0ad.desktop", "0ad.desktop") \ No newline at end of file + pisitools.insinto("/usr/share/applications/", "build/resources/0ad.desktop", "0ad.desktop") diff --git a/game/strategy/0ad/files/fix_python_3.11_ftbfs.patch b/game/strategy/0ad/files/fix_python_3.11_ftbfs.patch new file mode 100644 index 0000000000..7be022b9dd --- /dev/null +++ b/game/strategy/0ad/files/fix_python_3.11_ftbfs.patch @@ -0,0 +1,138 @@ +Description: Fix mozjs/spidermonkey FTBFS with python 3.11 +Origin: Fedora, https://src.fedoraproject.org/rpms/0ad/tree/main +Bug-Debian: https://bugs.debian.org/1028179 + +--- /dev/null ++++ b/libraries/source/spidermonkey/0001-Python-Build-Use-r-instead-of-rU-file-read-modes.patch +@@ -0,0 +1,81 @@ ++From 95f1e91ef71d912be5f6dddb6fac68671d850fd6 Mon Sep 17 00:00:00 2001 ++From: =?UTF-8?q?Franti=C5=A1ek=20Zatloukal?= ++Date: Sun, 24 Jul 2022 11:11:01 +0200 ++Subject: [PATCH] Python/Build: Use r instead of rU file read modes ++ ++Fixes Python 3.11 build ++--- ++ python/mozbuild/mozbuild/action/process_define_files.py | 2 +- ++ python/mozbuild/mozbuild/preprocessor.py | 6 +++--- ++ python/mozbuild/mozbuild/util.py | 4 +++- ++ 3 files changed, 7 insertions(+), 5 deletions(-) ++ ++diff --git a/python/mozbuild/mozbuild/action/process_define_files.py b/python/mozbuild/mozbuild/action/process_define_files.py ++index 6fff0d1..de2bcf4 100644 ++--- a/python/mozbuild/mozbuild/action/process_define_files.py +++++ b/python/mozbuild/mozbuild/action/process_define_files.py ++@@ -36,7 +36,7 @@ def process_define_file(output, input): ++ not config.substs.get('JS_STANDALONE'): ++ config = PartialConfigEnvironment(mozpath.join(topobjdir, 'js', 'src')) ++ ++- with open(path, 'rU') as input: +++ with open(path, 'r') as input: ++ r = re.compile('^\s*#\s*(?P[a-z]+)(?:\s+(?P\S+)(?:\s+(?P\S+))?)?', re.U) ++ for l in input: ++ m = r.match(l) ++diff --git a/python/mozbuild/mozbuild/preprocessor.py b/python/mozbuild/mozbuild/preprocessor.py ++index 0e3a750..66f5cf7 100644 ++--- a/python/mozbuild/mozbuild/preprocessor.py +++++ b/python/mozbuild/mozbuild/preprocessor.py ++@@ -517,7 +517,7 @@ class Preprocessor: ++ ++ if args: ++ for f in args: ++- with io.open(f, 'rU', encoding='utf-8') as input: +++ with io.open(f, 'r', encoding='utf-8') as input: ++ self.processFile(input=input, output=out) ++ if depfile: ++ mk = Makefile() ++@@ -807,7 +807,7 @@ class Preprocessor: ++ args = self.applyFilters(args) ++ if not os.path.isabs(args): ++ args = os.path.join(self.curdir, args) ++- args = io.open(args, 'rU', encoding='utf-8') +++ args = io.open(args, 'r', encoding='utf-8') ++ except Preprocessor.Error: ++ raise ++ except Exception: ++@@ -862,7 +862,7 @@ def preprocess(includes=[sys.stdin], defines={}, ++ pp = Preprocessor(defines=defines, ++ marker=marker) ++ for f in includes: ++- with io.open(f, 'rU', encoding='utf-8') as input: +++ with io.open(f, 'r', encoding='utf-8') as input: ++ pp.processFile(input=input, output=output) ++ return pp.includes ++ ++diff --git a/python/mozbuild/mozbuild/util.py b/python/mozbuild/mozbuild/util.py ++index 044cf64..eb992ce 100644 ++--- a/python/mozbuild/mozbuild/util.py +++++ b/python/mozbuild/mozbuild/util.py ++@@ -54,6 +54,8 @@ def exec_(object, globals=None, locals=None): ++ ++ ++ def _open(path, mode): +++ if mode == "rU": +++ mode = "r" ++ if 'b' in mode: ++ return io.open(path, mode) ++ return io.open(path, mode, encoding='utf-8', newline='\n') ++@@ -220,7 +222,7 @@ class FileAvoidWrite(BytesIO): ++ still occur, as well as diff capture if requested. ++ """ ++ ++- def __init__(self, filename, capture_diff=False, dry_run=False, readmode='rU'): +++ def __init__(self, filename, capture_diff=False, dry_run=False, readmode='r'): ++ BytesIO.__init__(self) ++ self.name = filename ++ assert type(capture_diff) == bool ++-- ++2.37.1 ++ +--- a/libraries/source/spidermonkey/patch.sh ++++ b/libraries/source/spidermonkey/patch.sh +@@ -2,6 +2,19 @@ + # Apply patches if needed + # This script gets called from build.sh. + ++# https://bugs.debian.org/1028179 ++# The hack below is unfortunately necessary because GNU patch is unable to ++# handle binary patches. Fixing this FTBFS in mozjs requires pulling in a ++# virtualenv upgrade for mozjs. ++# https://src.fedoraproject.org/rpms/0ad/blob/main/f/0ad-python311.patch ++# https://github.com/mozilla/gecko-dev/commit/74641307d32a59806b75cd2b8c7161aca50d5cb7.patch ++git init . -b main ++git config user.name 'Debian Games' ++git config user.email 'pkg-games-devel@lists.alioth.debian.org' ++git add . ++git commit -m 'Initial commit' ++git am --keep-cr ../mozjs_virtualenv.patch ++ + # SM78 fails to create virtual envs on macs with python > 3.7 + # Unfortunately, 3.7 is mostly unavailable on ARM macs. + # Therefore, replace the custom script with a more up-to-date version from pip +@@ -19,14 +32,6 @@ + export PYTHONPATH="$(pwd)/virtualenv:$PYTHONPATH" + patch -p1 < ../FixVirtualEnv.diff + fi +-else +- # In python 3.10 `sysconfig._get_default_scheme()` was renamed to +- # `sysconfig.get_default_scheme()`. This breaks the version of +- # `virtualenv` bundled with the spidermonkey source code. +- # +- # It is assumed that the updated version fetched for macOS systems +- # above does not have this problem. +- patch -p1 < ../FixVirtualenvForPython310.diff + fi + + # Mozglue symbols need to be linked against static builds. +@@ -78,6 +83,12 @@ + # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1001882 + patch -p1 < ../Fix-armhf-build-for-GCC-11-627.patch + ++# https://bugs.debian.org/1028179 ++# https://src.fedoraproject.org/rpms/0ad/blob/main/f/0001-Python-Build-Use-r-instead-of-rU-file-read-modes.patch ++patch -p1 < ../0001-Python-Build-Use-r-instead-of-rU-file-read-modes.patch ++ ++sed -e 's|rest\[1\], 16|0|g' -i python/mozbuild/mozbuild/action/check_binary.py ++ + # Patch those separately, as they might interfere with normal behaviour. + if [ "$(uname -s)" = "FreeBSD" ]; + then diff --git a/game/strategy/0ad/files/mozjs_virtualenv.patch b/game/strategy/0ad/files/mozjs_virtualenv.patch new file mode 100644 index 0000000000..2e3b2264d5 --- /dev/null +++ b/game/strategy/0ad/files/mozjs_virtualenv.patch @@ -0,0 +1,135904 @@ +From 74641307d32a59806b75cd2b8c7161aca50d5cb7 Mon Sep 17 00:00:00 2001 +From: Mike Hommey +Date: Wed, 7 Oct 2020 00:20:01 +0000 +Subject: [PATCH] Bug 1654457 - Update virtualenv to 20.0.31. + r=mhentges,rstewart a=RyanVM + +Differential Revision: https://phabricator.services.mozilla.com/D92173 +--- + python/mozbuild/mozbuild/virtualenv.py | 2 +- + third_party/python/virtualenv/AUTHORS.txt | 93 - + third_party/python/virtualenv/MANIFEST.in | 22 - + third_party/python/virtualenv/PKG-INFO | 78 - + third_party/python/virtualenv/README.rst | 44 - + third_party/python/virtualenv/README_MOZILLA | 10 + + third_party/python/virtualenv/__main__.py | 168 ++ + .../appdirs-1.4.4.dist-info/LICENSE.txt | 23 + + .../appdirs-1.4.4.dist-info/METADATA | 264 ++ + .../appdirs-1.4.4.dist-info/RECORD | 6 + + .../appdirs-1.4.4.dist-info/WHEEL | 6 + + .../appdirs-1.4.4.dist-info/top_level.txt | 1 + + .../appdirs-1.4.4-py2.py3-none-any/appdirs.py | 608 ++++ + .../backports/__init__.py | 6 + + .../backports/configparser/__init__.py | 1473 +++++++++ + .../backports/configparser/helpers.py | 274 ++ + .../configparser-4.0.2.dist-info/LICENSE | 7 + + .../configparser-4.0.2.dist-info/METADATA | 259 ++ + .../configparser-4.0.2.dist-info/RECORD | 9 + + .../configparser-4.0.2.dist-info/WHEEL | 6 + + .../top_level.txt | 2 + + .../configparser.py | 61 + + .../LICENSE.txt | 122 + + .../METADATA | 70 + + .../contextlib2-0.6.0.post1.dist-info/RECORD | 6 + + .../contextlib2-0.6.0.post1.dist-info/WHEEL | 6 + + .../top_level.txt | 1 + + .../contextlib2.py | 518 ++++ + .../distlib-0.3.1.dist-info/METADATA | 24 + + .../distlib-0.3.1.dist-info/RECORD | 26 + + .../distlib-0.3.1.dist-info/WHEEL | 5 + + .../distlib/__init__.py | 23 + + .../distlib/_backport/__init__.py | 6 + + .../distlib/_backport/misc.py | 41 + + .../distlib/_backport/shutil.py | 764 +++++ + .../distlib/_backport/sysconfig.cfg | 84 + + .../distlib/_backport/sysconfig.py | 786 +++++ + .../distlib/_backport/tarfile.py | 2607 ++++++++++++++++ + .../distlib/compat.py | 1120 +++++++ + .../distlib/database.py | 1339 +++++++++ + .../distlib/index.py | 516 ++++ + .../distlib/locators.py | 1302 ++++++++ + .../distlib/manifest.py | 393 +++ + .../distlib/markers.py | 131 + + .../distlib/metadata.py | 1056 +++++++ + .../distlib/resources.py | 355 +++ + .../distlib/scripts.py | 419 +++ + .../distlib/t32.exe | Bin 0 -> 96768 bytes + .../distlib/t64.exe | Bin 0 -> 105984 bytes + .../distlib/util.py | 1761 +++++++++++ + .../distlib/version.py | 736 +++++ + .../distlib/w32.exe | Bin 0 -> 90112 bytes + .../distlib/w64.exe | Bin 0 -> 99840 bytes + .../distlib/wheel.py | 1018 +++++++ + .../filelock-3.0.12.dist-info/LICENSE | 24 + + .../filelock-3.0.12.dist-info/METADATA | 156 + + .../filelock-3.0.12.dist-info/RECORD | 6 + + .../filelock-3.0.12.dist-info/WHEEL | 5 + + .../filelock-3.0.12.dist-info/top_level.txt | 1 + + .../filelock-3.0.12-py3-none-any/filelock.py | 451 +++ + .../LICENSE | 13 + + .../METADATA | 65 + + .../importlib_metadata-1.1.3.dist-info/RECORD | 21 + + .../importlib_metadata-1.1.3.dist-info/WHEEL | 6 + + .../top_level.txt | 1 + + .../importlib_metadata/__init__.py | 541 ++++ + .../importlib_metadata/_compat.py | 143 + + .../LICENSE | 13 + + .../METADATA | 66 + + .../importlib_metadata-1.7.0.dist-info/RECORD | 21 + + .../importlib_metadata-1.7.0.dist-info/WHEEL | 6 + + .../top_level.txt | 1 + + .../importlib_metadata/__init__.py | 623 ++++ + .../importlib_metadata/_compat.py | 152 + + .../LICENSE | 13 + + .../METADATA | 49 + + .../RECORD | 39 + + .../importlib_resources-1.0.2.dist-info/WHEEL | 6 + + .../top_level.txt | 1 + + .../importlib_resources/__init__.py | 36 + + .../importlib_resources/_compat.py | 23 + + .../importlib_resources/_py2.py | 270 ++ + .../importlib_resources/_py3.py | 312 ++ + .../importlib_resources/abc.py | 58 + + .../importlib_resources/version.txt | 1 + + .../LICENSE | 13 + + .../METADATA | 53 + + .../RECORD | 40 + + .../importlib_resources-3.0.0.dist-info/WHEEL | 6 + + .../top_level.txt | 1 + + .../importlib_resources/__init__.py | 53 + + .../importlib_resources/_common.py | 121 + + .../importlib_resources/_compat.py | 127 + + .../importlib_resources/_py2.py | 107 + + .../importlib_resources/_py3.py | 150 + + .../importlib_resources/abc.py | 142 + + .../importlib_resources/py.typed} | 0 + .../importlib_resources/readers.py | 41 + + .../importlib_resources/trees.py | 6 + + .../pathlib2-2.3.5.dist-info/DESCRIPTION.rst | 61 + + .../pathlib2-2.3.5.dist-info/METADATA | 88 + + .../pathlib2-2.3.5.dist-info/RECORD | 7 + + .../pathlib2-2.3.5.dist-info/WHEEL | 6 + + .../pathlib2-2.3.5.dist-info/metadata.json | 1 + + .../pathlib2-2.3.5.dist-info/top_level.txt | 1 + + .../pathlib2/__init__.py | 1809 +++++++++++ + .../scandir-1.10.0.dist-info/LICENSE.txt | 27 + + .../scandir-1.10.0.dist-info/METADATA | 238 ++ + .../scandir-1.10.0.dist-info/RECORD | 7 + + .../scandir-1.10.0.dist-info/WHEEL | 5 + + .../scandir-1.10.0.dist-info/top_level.txt | 2 + + .../scandir.py | 693 +++++ + .../six-1.15.0.dist-info/LICENSE | 18 + + .../six-1.15.0.dist-info/METADATA | 49 + + .../six-1.15.0.dist-info/RECORD | 6 + + .../six-1.15.0.dist-info/WHEEL | 6 + + .../six-1.15.0.dist-info/top_level.txt | 1 + + .../six-1.15.0-py2.py3-none-any/six.py | 982 ++++++ + .../typing-3.7.4.1.dist-info/LICENSE | 254 ++ + .../typing-3.7.4.1.dist-info/METADATA | 41 + + .../typing-3.7.4.1.dist-info/RECORD | 6 + + .../typing-3.7.4.1.dist-info/WHEEL | 5 + + .../typing-3.7.4.1.dist-info/top_level.txt | 1 + + .../typing-3.7.4.1-py3-none-any/typing.py | 2422 +++++++++++++++ + .../typing-3.7.4.3.dist-info/LICENSE | 254 ++ + .../typing-3.7.4.3.dist-info/METADATA | 50 + + .../typing-3.7.4.3.dist-info/RECORD | 6 + + .../typing-3.7.4.3.dist-info/WHEEL | 5 + + .../typing-3.7.4.3.dist-info/top_level.txt | 1 + + .../typing-3.7.4.3-py2-none-any/typing.py | 2550 ++++++++++++++++ + .../zipp-1.2.0.dist-info/LICENSE | 7 + + .../zipp-1.2.0.dist-info/METADATA | 49 + + .../zipp-1.2.0.dist-info/RECORD | 6 + + .../zipp-1.2.0.dist-info/WHEEL | 6 + + .../zipp-1.2.0.dist-info/top_level.txt | 1 + + .../zipp-1.2.0-py2.py3-none-any/zipp.py | 286 ++ + .../zipp-3.1.0.dist-info/LICENSE | 19 + + .../zipp-3.1.0.dist-info/METADATA | 52 + + .../zipp-3.1.0.dist-info/RECORD | 6 + + .../zipp-3.1.0.dist-info/WHEEL | 5 + + .../zipp-3.1.0.dist-info/top_level.txt | 1 + + .../zipp-3.1.0-py3-none-any/zipp.py | 285 ++ + .../python/virtualenv/distributions.json | 83 + + third_party/python/virtualenv/modules.json | 341 +++ + third_party/python/virtualenv/pyproject.toml | 51 - + third_party/python/virtualenv/setup.cfg | 86 - + third_party/python/virtualenv/setup.py | 16 - + .../python/virtualenv/tasks/make_zipapp.py | 37 - + .../python/virtualenv/tasks/release.py | 76 - + .../virtualenv/tasks/update_embedded.py | 89 - + .../python/virtualenv/tasks/upgrade_wheels.py | 48 - + third_party/python/virtualenv/tox.ini | 127 - + .../LICENSE} | 4 +- + .../virtualenv-20.0.31.dist-info/METADATA | 91 + + .../virtualenv-20.0.31.dist-info/RECORD | 120 + + .../virtualenv-20.0.31.dist-info/WHEEL | 6 + + .../entry_points.txt | 32 + + .../top_level.txt | 1 + + .../virtualenv-20.0.31.dist-info/zip-safe | 1 + + third_party/python/virtualenv/virtualenv.py | 2648 +---------------- + .../python/virtualenv/virtualenv/__init__.py | 10 + + .../python/virtualenv/virtualenv/__main__.py | 77 + + .../virtualenv/activation/__init__.py | 19 + + .../virtualenv/activation/activator.py | 44 + + .../virtualenv/activation/bash/__init__.py | 13 + + .../activation/bash}/activate.sh | 2 +- + .../virtualenv/activation/batch/__init__.py | 23 + + .../activation/batch}/activate.bat | 7 +- + .../activation/batch}/deactivate.bat | 0 + .../virtualenv/activation/batch/pydoc.bat | 1 + + .../virtualenv/activation/cshell/__init__.py | 14 + + .../activation/cshell}/activate.csh | 6 +- + .../virtualenv/activation/fish/__init__.py | 10 + + .../activation/fish}/activate.fish | 28 +- + .../activation/powershell/__init__.py | 10 + + .../activation/powershell}/activate.ps1 | 0 + .../virtualenv/activation/python/__init__.py | 35 + + .../activation/python/activate_this.py | 32 + + .../virtualenv/activation/via_template.py | 65 + + .../virtualenv/activation/xonsh/__init__.py | 14 + + .../activation/xonsh}/activate.xsh | 0 + .../virtualenv/app_data/__init__.py | 62 + + .../virtualenv/virtualenv/app_data/base.py | 91 + + .../virtualenv/virtualenv/app_data/na.py | 67 + + .../virtualenv/app_data/via_disk_folder.py | 172 ++ + .../virtualenv/app_data/via_tempdir.py | 28 + + .../virtualenv/virtualenv/config/__init__.py | 1 + + .../virtualenv/config/cli/__init__.py | 1 + + .../virtualenv/config/cli/parser.py | 120 + + .../virtualenv/virtualenv/config/convert.py | 81 + + .../virtualenv/virtualenv/config/env_var.py | 29 + + .../virtualenv/virtualenv/config/ini.py | 83 + + .../virtualenv/virtualenv/create/__init__.py | 1 + + .../virtualenv/virtualenv/create/creator.py | 224 ++ + .../virtualenv/virtualenv/create/debug.py | 110 + + .../virtualenv/virtualenv/create/describe.py | 117 + + .../virtualenv/virtualenv/create/pyenv_cfg.py | 61 + + .../create/via_global_ref/__init__.py | 0 + .../create/via_global_ref/_virtualenv.py | 130 + + .../virtualenv/create/via_global_ref/api.py | 111 + + .../create/via_global_ref/builtin/__init__.py | 0 + .../via_global_ref/builtin/builtin_way.py | 17 + + .../builtin/cpython/__init__.py | 1 + + .../via_global_ref/builtin/cpython/common.py | 56 + + .../builtin/cpython/cpython2.py | 102 + + .../builtin/cpython/cpython3.py | 71 + + .../via_global_ref/builtin/cpython/mac_os.py | 297 ++ + .../via_global_ref/builtin/pypy/__init__.py | 0 + .../via_global_ref/builtin/pypy/common.py | 52 + + .../via_global_ref/builtin/pypy/pypy2.py | 121 + + .../via_global_ref/builtin/pypy/pypy3.py | 63 + + .../builtin/python2/__init__.py | 0 + .../via_global_ref/builtin/python2/python2.py | 111 + + .../via_global_ref/builtin/python2/site.py | 165 + + .../create/via_global_ref/builtin/ref.py | 163 + + .../builtin/via_global_self_do.py | 99 + + .../virtualenv/create/via_global_ref/store.py | 26 + + .../virtualenv/create/via_global_ref/venv.py | 80 + + .../virtualenv/discovery/__init__.py | 1 + + .../virtualenv/discovery/builtin.py | 155 + + .../virtualenv/discovery/cached_py_info.py | 145 + + .../virtualenv/discovery/discover.py | 46 + + .../virtualenv/discovery/py_info.py | 489 +++ + .../virtualenv/discovery/py_spec.py | 122 + + .../virtualenv/discovery/windows/__init__.py | 28 + + .../virtualenv/discovery/windows/pep514.py | 161 + + .../python/virtualenv/virtualenv/info.py | 65 + + .../python/virtualenv/virtualenv/report.py | 57 + + .../virtualenv/virtualenv/run/__init__.py | 150 + + .../virtualenv/run/plugin/__init__.py | 0 + .../virtualenv/run/plugin/activators.py | 53 + + .../virtualenv/virtualenv/run/plugin/base.py | 58 + + .../virtualenv/run/plugin/creators.py | 77 + + .../virtualenv/run/plugin/discovery.py | 31 + + .../virtualenv/run/plugin/seeders.py | 31 + + .../virtualenv/virtualenv/run/session.py | 90 + + .../virtualenv/virtualenv/seed/__init__.py | 1 + + .../virtualenv/seed/embed/__init__.py | 0 + .../virtualenv/seed/embed/base_embed.py | 117 + + .../virtualenv/seed/embed/pip_invoke.py | 56 + + .../seed/embed/via_app_data/__init__.py | 0 + .../via_app_data/pip_install/__init__.py | 0 + .../embed/via_app_data/pip_install/base.py | 158 + + .../embed/via_app_data/pip_install/copy.py | 35 + + .../embed/via_app_data/pip_install/symlink.py | 61 + + .../seed/embed/via_app_data/via_app_data.py | 142 + + .../virtualenv/virtualenv/seed/seeder.py | 39 + + .../virtualenv/seed/wheels/__init__.py | 11 + + .../virtualenv/seed/wheels/acquire.py | 122 + + .../virtualenv/seed/wheels/bundle.py | 51 + + .../virtualenv/seed/wheels/embed/__init__.py | 62 + + .../embed}/pip-19.1.1-py2.py3-none-any.whl | Bin + .../embed/pip-20.2.2-py2.py3-none-any.whl | Bin 0 -> 1503623 bytes + .../setuptools-43.0.0-py2.py3-none-any.whl} | Bin 582933 -> 583228 bytes + .../setuptools-44.1.1-py2.py3-none-any.whl | Bin 0 -> 583493 bytes + .../embed/setuptools-49.6.0-py3-none-any.whl | Bin 0 -> 803275 bytes + .../embed}/wheel-0.33.6-py2.py3-none-any.whl | Bin + .../embed/wheel-0.35.1-py2.py3-none-any.whl | Bin 0 -> 33174 bytes + .../virtualenv/seed/wheels/periodic_update.py | 364 +++ + .../virtualenv/virtualenv/seed/wheels/util.py | 116 + + .../virtualenv/virtualenv/util/__init__.py | 11 + + .../virtualenv/virtualenv/util/error.py | 13 + + .../python/virtualenv/virtualenv/util/lock.py | 120 + + .../virtualenv/util/path/__init__.py | 16 + + .../virtualenv/util/path/_pathlib/__init__.py | 45 + + .../util/path/_pathlib/via_os_path.py | 145 + + .../virtualenv/util/path/_permission.py | 32 + + .../virtualenv/virtualenv/util/path/_sync.py | 96 + + .../python/virtualenv/virtualenv/util/six.py | 50 + + .../virtualenv/util/subprocess/__init__.py | 36 + + .../util/subprocess/_win_subprocess.py | 171 ++ + .../virtualenv/virtualenv/util/zipapp.py | 33 + + .../python/virtualenv/virtualenv/version.py | 3 + + .../virtualenv_embedded/activate_this.py | 46 - + .../virtualenv_embedded/distutils-init.py | 134 - + .../virtualenv_embedded/distutils.cfg | 6 - + .../virtualenv_embedded/python-config | 78 - + .../virtualenv/virtualenv_embedded/site.py | 829 ------ + .../pip-19.3.1-py2.py3-none-any.whl | Bin 1415262 -> 0 bytes + 279 files changed, 40601 insertions(+), 4502 deletions(-) + delete mode 100644 third_party/python/virtualenv/AUTHORS.txt + delete mode 100644 third_party/python/virtualenv/MANIFEST.in + delete mode 100644 third_party/python/virtualenv/PKG-INFO + delete mode 100644 third_party/python/virtualenv/README.rst + create mode 100644 third_party/python/virtualenv/README_MOZILLA + create mode 100644 third_party/python/virtualenv/__main__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/LICENSE.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/helpers.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser-4.0.2.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser-4.0.2.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser-4.0.2.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser-4.0.2.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser-4.0.2.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/configparser.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2-0.6.0.post1.dist-info/LICENSE.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2-0.6.0.post1.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2-0.6.0.post1.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2-0.6.0.post1.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2-0.6.0.post1.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/contextlib2-0.6.0.post1-py2.py3-none-any/contextlib2.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib-0.3.1.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/misc.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/shutil.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.cfg + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/sysconfig.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/_backport/tarfile.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/compat.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/database.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/index.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/locators.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/manifest.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/markers.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/metadata.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/resources.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/scripts.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/t32.exe + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/t64.exe + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/util.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/version.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/w32.exe + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/w64.exe + create mode 100644 third_party/python/virtualenv/__virtualenv__/distlib-0.3.1-py2.py3-none-any/distlib/wheel.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock-3.0.12.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/filelock-3.0.12-py3-none-any/filelock.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata-1.1.3.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.1.3-py2.py3-none-any/importlib_metadata/_compat.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata-1.7.0.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_metadata-1.7.0-py2.py3-none-any/importlib_metadata/_compat.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources-1.0.2.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/_compat.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/_py2.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/_py3.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/abc.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-1.0.2-py2.py3-none-any/importlib_resources/version.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources-3.0.0.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_common.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_compat.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py2.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/_py3.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/abc.py + rename third_party/python/virtualenv/{virtualenv_support/__init__.py => __virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/py.typed} (100%) + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/readers.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/importlib_resources-3.0.0-py2.py3-none-any/importlib_resources/trees.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info/DESCRIPTION.rst + create mode 100644 third_party/python/virtualenv/__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info/metadata.json + create mode 100644 third_party/python/virtualenv/__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2-2.3.5.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/pathlib2-2.3.5-py2.py3-none-any/pathlib2/__init__.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/LICENSE.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir-1.10.0.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/scandir-1.10.0-cp38-cp38-macosx_10_15_x86_64/scandir.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/six-1.15.0-py2.py3-none-any/six-1.15.0.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/six-1.15.0-py2.py3-none-any/six.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.1-py3-none-any/typing-3.7.4.1.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.1-py3-none-any/typing-3.7.4.1.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.1-py3-none-any/typing-3.7.4.1.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.1-py3-none-any/typing-3.7.4.1.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.1-py3-none-any/typing-3.7.4.1.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.1-py3-none-any/typing.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.3-py2-none-any/typing-3.7.4.3.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.3-py2-none-any/typing-3.7.4.3.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.3-py2-none-any/typing-3.7.4.3.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.3-py2-none-any/typing-3.7.4.3.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.3-py2-none-any/typing-3.7.4.3.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/typing-3.7.4.3-py2-none-any/typing.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp-1.2.0.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-1.2.0-py2.py3-none-any/zipp.py + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/LICENSE + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp-3.1.0.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/__virtualenv__/zipp-3.1.0-py3-none-any/zipp.py + create mode 100644 third_party/python/virtualenv/distributions.json + create mode 100644 third_party/python/virtualenv/modules.json + delete mode 100644 third_party/python/virtualenv/pyproject.toml + delete mode 100644 third_party/python/virtualenv/setup.cfg + delete mode 100644 third_party/python/virtualenv/setup.py + delete mode 100644 third_party/python/virtualenv/tasks/make_zipapp.py + delete mode 100644 third_party/python/virtualenv/tasks/release.py + delete mode 100755 third_party/python/virtualenv/tasks/update_embedded.py + delete mode 100644 third_party/python/virtualenv/tasks/upgrade_wheels.py + delete mode 100644 third_party/python/virtualenv/tox.ini + rename third_party/python/virtualenv/{LICENSE.txt => virtualenv-20.0.31.dist-info/LICENSE} (86%) + create mode 100644 third_party/python/virtualenv/virtualenv-20.0.31.dist-info/METADATA + create mode 100644 third_party/python/virtualenv/virtualenv-20.0.31.dist-info/RECORD + create mode 100644 third_party/python/virtualenv/virtualenv-20.0.31.dist-info/WHEEL + create mode 100644 third_party/python/virtualenv/virtualenv-20.0.31.dist-info/entry_points.txt + create mode 100644 third_party/python/virtualenv/virtualenv-20.0.31.dist-info/top_level.txt + create mode 100644 third_party/python/virtualenv/virtualenv-20.0.31.dist-info/zip-safe + mode change 100755 => 100644 third_party/python/virtualenv/virtualenv.py + create mode 100644 third_party/python/virtualenv/virtualenv/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/__main__.py + create mode 100644 third_party/python/virtualenv/virtualenv/activation/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/activation/activator.py + create mode 100644 third_party/python/virtualenv/virtualenv/activation/bash/__init__.py + rename third_party/python/virtualenv/{virtualenv_embedded => virtualenv/activation/bash}/activate.sh (98%) + create mode 100644 third_party/python/virtualenv/virtualenv/activation/batch/__init__.py + rename third_party/python/virtualenv/{virtualenv_embedded => virtualenv/activation/batch}/activate.bat (77%) + rename third_party/python/virtualenv/{virtualenv_embedded => virtualenv/activation/batch}/deactivate.bat (100%) + create mode 100644 third_party/python/virtualenv/virtualenv/activation/batch/pydoc.bat + create mode 100644 third_party/python/virtualenv/virtualenv/activation/cshell/__init__.py + rename third_party/python/virtualenv/{virtualenv_embedded => virtualenv/activation/cshell}/activate.csh (92%) + create mode 100644 third_party/python/virtualenv/virtualenv/activation/fish/__init__.py + rename third_party/python/virtualenv/{virtualenv_embedded => virtualenv/activation/fish}/activate.fish (77%) + create mode 100644 third_party/python/virtualenv/virtualenv/activation/powershell/__init__.py + rename third_party/python/virtualenv/{virtualenv_embedded => virtualenv/activation/powershell}/activate.ps1 (100%) + create mode 100644 third_party/python/virtualenv/virtualenv/activation/python/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/activation/python/activate_this.py + create mode 100644 third_party/python/virtualenv/virtualenv/activation/via_template.py + create mode 100644 third_party/python/virtualenv/virtualenv/activation/xonsh/__init__.py + rename third_party/python/virtualenv/{virtualenv_embedded => virtualenv/activation/xonsh}/activate.xsh (100%) + create mode 100644 third_party/python/virtualenv/virtualenv/app_data/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/app_data/base.py + create mode 100644 third_party/python/virtualenv/virtualenv/app_data/na.py + create mode 100644 third_party/python/virtualenv/virtualenv/app_data/via_disk_folder.py + create mode 100644 third_party/python/virtualenv/virtualenv/app_data/via_tempdir.py + create mode 100644 third_party/python/virtualenv/virtualenv/config/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/config/cli/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/config/cli/parser.py + create mode 100644 third_party/python/virtualenv/virtualenv/config/convert.py + create mode 100644 third_party/python/virtualenv/virtualenv/config/env_var.py + create mode 100644 third_party/python/virtualenv/virtualenv/config/ini.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/creator.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/debug.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/describe.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/pyenv_cfg.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/_virtualenv.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/api.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/builtin_way.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/common.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython2.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/cpython/mac_os.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/common.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/pypy2.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/pypy/pypy3.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/python2.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/python2/site.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/ref.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/builtin/via_global_self_do.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/store.py + create mode 100644 third_party/python/virtualenv/virtualenv/create/via_global_ref/venv.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/builtin.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/cached_py_info.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/discover.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/py_info.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/py_spec.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/windows/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/discovery/windows/pep514.py + create mode 100644 third_party/python/virtualenv/virtualenv/info.py + create mode 100644 third_party/python/virtualenv/virtualenv/report.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/plugin/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/plugin/activators.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/plugin/base.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/plugin/creators.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/plugin/discovery.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/plugin/seeders.py + create mode 100644 third_party/python/virtualenv/virtualenv/run/session.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/base_embed.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/pip_invoke.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/pip_install/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/pip_install/base.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/pip_install/copy.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/pip_install/symlink.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/embed/via_app_data/via_app_data.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/seeder.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/acquire.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/bundle.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/embed/__init__.py + rename third_party/python/virtualenv/{virtualenv_support => virtualenv/seed/wheels/embed}/pip-19.1.1-py2.py3-none-any.whl (100%) + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/embed/pip-20.2.2-py2.py3-none-any.whl + rename third_party/python/virtualenv/{virtualenv_support/setuptools-41.6.0-py2.py3-none-any.whl => virtualenv/seed/wheels/embed/setuptools-43.0.0-py2.py3-none-any.whl} (84%) + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-44.1.1-py2.py3-none-any.whl + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/embed/setuptools-49.6.0-py3-none-any.whl + rename third_party/python/virtualenv/{virtualenv_support => virtualenv/seed/wheels/embed}/wheel-0.33.6-py2.py3-none-any.whl (100%) + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/embed/wheel-0.35.1-py2.py3-none-any.whl + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/periodic_update.py + create mode 100644 third_party/python/virtualenv/virtualenv/seed/wheels/util.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/error.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/lock.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/path/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/path/_pathlib/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/path/_pathlib/via_os_path.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/path/_permission.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/path/_sync.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/six.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/subprocess/__init__.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/subprocess/_win_subprocess.py + create mode 100644 third_party/python/virtualenv/virtualenv/util/zipapp.py + create mode 100644 third_party/python/virtualenv/virtualenv/version.py + delete mode 100644 third_party/python/virtualenv/virtualenv_embedded/activate_this.py + delete mode 100644 third_party/python/virtualenv/virtualenv_embedded/distutils-init.py + delete mode 100644 third_party/python/virtualenv/virtualenv_embedded/distutils.cfg + delete mode 100644 third_party/python/virtualenv/virtualenv_embedded/python-config + delete mode 100644 third_party/python/virtualenv/virtualenv_embedded/site.py + delete mode 100644 third_party/python/virtualenv/virtualenv_support/pip-19.3.1-py2.py3-none-any.whl + +diff --git a/python/mozbuild/mozbuild/virtualenv.py b/python/mozbuild/mozbuild/virtualenv.py +index 67d2fa52322a3..4cad5830eb347 100644 +--- a/python/mozbuild/mozbuild/virtualenv.py ++++ b/python/mozbuild/mozbuild/virtualenv.py +@@ -438,7 +438,7 @@ def handle_package(package): + handle_package(package) + + sitecustomize = os.path.join( +- os.path.dirname(os.__file__), 'sitecustomize.py') ++ os.path.dirname(python_lib), 'sitecustomize.py') + with open(sitecustomize, 'w') as f: + f.write( + '# Importing mach_bootstrap has the side effect of\n' +diff --git a/third_party/python/virtualenv/AUTHORS.txt b/third_party/python/virtualenv/AUTHORS.txt +deleted file mode 100644 +index dc676beb41e0b..0000000000000 +--- a/third_party/python/virtualenv/AUTHORS.txt ++++ /dev/null +@@ -1,93 +0,0 @@ +-Author +------- +- +-Ian Bicking +- +-Maintainers +------------ +- +-Brian Rosner +-Bernat Gabor +-Carl Meyer +-Jannis Leidel +-Paul Moore +-Paul Nasrat +-Marcus Smith +- +-Contributors +------------- +- +-Alex Grönholm +-Anatoly Techtonik +-Antonio Cuni +-Antonio Valentino +-Armin Ronacher +-Barry Warsaw +-Benjamin Root +-Bradley Ayers +-Branden Rolston +-Brandon Carl +-Brian Kearns +-Cap Petschulat +-CBWhiz +-Chris Adams +-Chris McDonough +-Christos Kontas +-Christian Hudon +-Christian Stefanescu +-Christopher Nilsson +-Cliff Xuan +-Curt Micol +-Damien Nozay +-Dan Sully +-Daniel Hahler +-Daniel Holth +-David Schoonover +-Denis Costa +-Doug Hellmann +-Doug Napoleone +-Douglas Creager +-Eduard-Cristian Stefan +-Erik M. Bray +-Ethan Jucovy +-Gabriel de Perthuis +-Gunnlaugur Thor Briem +-Graham Dennis +-Greg Haskins +-Jason Penney +-Jason R. Coombs +-Jeff Hammel +-Jeremy Orem +-Jason Penney +-Jason R. Coombs +-John Kleint +-Jonathan Griffin +-Jonathan Hitchcock +-Jorge Vargas +-Josh Bronson +-Kamil Kisiel +-Kyle Gibson +-Konstantin Zemlyak +-Kumar McMillan +-Lars Francke +-Marc Abramowitz +-Mika Laitio +-Mike Hommey +-Miki Tebeka +-Philip Jenvey +-Philippe Ombredanne +-Piotr Dobrogost +-Preston Holmes +-Ralf Schmitt +-Raul Leal +-Ronny Pfannschmidt +-Satrajit Ghosh +-Sergio de Carvalho +-Stefano Rivera +-Tarek Ziadé +-Thomas Aglassinger +-Vinay Sajip +-Vitaly Babiy +-Vladimir Rutsky +-Wang Xuerui +-Wouter De Borger +diff --git a/third_party/python/virtualenv/MANIFEST.in b/third_party/python/virtualenv/MANIFEST.in +deleted file mode 100644 +index d47418dec02e2..0000000000000 +--- a/third_party/python/virtualenv/MANIFEST.in ++++ /dev/null +@@ -1,22 +0,0 @@ +-include virtualenv.py +-recursive-include virtualenv_support *.whl +-recursive-include virtualenv_embedded * +-include virtualenv_support/__init__.py +-include pyproject.toml +- +-include AUTHORS.txt +-include LICENSE.txt +- +-recursive-include tests * +-recursive-include docs * +-include tasks/* +-include tox.ini +- +-exclude readthedocs.yml +-exclude CONTRIBUTING.rst +-exclude .pre-commit-config.yaml +-exclude azure-run-tox-env.yml +-exclude azure-pipelines.yml +-exclude .gitignore +-exclude .gitattributes +-recursive-exclude .github * +diff --git a/third_party/python/virtualenv/PKG-INFO b/third_party/python/virtualenv/PKG-INFO +deleted file mode 100644 +index 779432c2dc5e0..0000000000000 +--- a/third_party/python/virtualenv/PKG-INFO ++++ /dev/null +@@ -1,78 +0,0 @@ +-Metadata-Version: 2.1 +-Name: virtualenv +-Version: 16.7.8 +-Summary: Virtual Python Environment builder +-Home-page: https://virtualenv.pypa.io/ +-Author: Ian Bicking +-Author-email: ianb@colorstudy.com +-Maintainer: Bernat Gabor +-Maintainer-email: gaborjbernat@gmail.com +-License: MIT +-Project-URL: Source, https://github.com/pypa/virtualenv +-Project-URL: Tracker, https://github.com/pypa/virtualenv/issues +-Description: virtualenv +- ========== +- +- A tool for creating isolated 'virtual' python environments. +- +- .. image:: https://img.shields.io/pypi/v/virtualenv.svg +- :target: https://pypi.org/project/virtualenv +- :alt: Latest version on PyPi +- .. image:: https://img.shields.io/pypi/pyversions/virtualenv.svg +- :target: https://pypi.org/project/virtualenv/ +- :alt: Supported Python versions +- .. image:: https://dev.azure.com/pypa/virtualenv/_apis/build/status/pypa.virtualenv?branchName=master +- :target: https://dev.azure.com/pypa/virtualenv/_build/latest?definitionId=11&branchName=master +- :alt: Azure Pipelines build status +- .. image:: https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square +- :target: https://virtualenv.readthedocs.io/en/latest/?badge=latest +- :alt: Documentation status +- .. image:: https://img.shields.io/badge/code%20style-black-000000.svg +- :target: https://github.com/ambv/black +- :alt: Code style: black +- .. image:: https://pepy.tech/badge/virtualenv/month +- :target: https://pepy.tech/project/virtualenv/month +- :alt: Downloads +- +- * `Installation `_ +- * `Documentation `_ +- * `Changelog `_ +- * `Issues `_ +- * `PyPI `_ +- * `Github `_ +- * `User mailing list `_ +- * `Dev mailing list `_ +- * User IRC: `#pypa on Freenode `_ +- * Dev IRC: `#pypa-dev on Freenode `_ +- +- +- Code of Conduct +- --------------- +- +- Everyone interacting in the virtualenv project's codebases, issue trackers, +- chat rooms, and mailing lists is expected to follow the +- `PyPA Code of Conduct`_. +- +- .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ +- +-Keywords: virtual,environments,isolated +-Platform: any +-Classifier: Development Status :: 5 - Production/Stable +-Classifier: Intended Audience :: Developers +-Classifier: License :: OSI Approved :: MIT License +-Classifier: Operating System :: POSIX +-Classifier: Operating System :: Microsoft :: Windows +-Classifier: Operating System :: MacOS :: MacOS X +-Classifier: Topic :: Software Development :: Testing +-Classifier: Topic :: Software Development :: Libraries +-Classifier: Topic :: Utilities +-Classifier: Programming Language :: Python :: 2 +-Classifier: Programming Language :: Python :: 2.7 +-Classifier: Programming Language :: Python :: 3 +-Classifier: Programming Language :: Python :: 3.4 +-Classifier: Programming Language :: Python :: 3.5 +-Classifier: Programming Language :: Python :: 3.6 +-Classifier: Programming Language :: Python :: 3.7 +-Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7 +-Provides-Extra: testing +-Provides-Extra: docs +diff --git a/third_party/python/virtualenv/README.rst b/third_party/python/virtualenv/README.rst +deleted file mode 100644 +index 34f33f28a6576..0000000000000 +--- a/third_party/python/virtualenv/README.rst ++++ /dev/null +@@ -1,44 +0,0 @@ +-virtualenv +-========== +- +-A tool for creating isolated 'virtual' python environments. +- +-.. image:: https://img.shields.io/pypi/v/virtualenv.svg +- :target: https://pypi.org/project/virtualenv +- :alt: Latest version on PyPi +-.. image:: https://img.shields.io/pypi/pyversions/virtualenv.svg +- :target: https://pypi.org/project/virtualenv/ +- :alt: Supported Python versions +-.. image:: https://dev.azure.com/pypa/virtualenv/_apis/build/status/pypa.virtualenv?branchName=master +- :target: https://dev.azure.com/pypa/virtualenv/_build/latest?definitionId=11&branchName=master +- :alt: Azure Pipelines build status +-.. image:: https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square +- :target: https://virtualenv.readthedocs.io/en/latest/?badge=latest +- :alt: Documentation status +-.. image:: https://img.shields.io/badge/code%20style-black-000000.svg +- :target: https://github.com/ambv/black +- :alt: Code style: black +-.. image:: https://pepy.tech/badge/virtualenv/month +- :target: https://pepy.tech/project/virtualenv/month +- :alt: Downloads +- +-* `Installation `_ +-* `Documentation `_ +-* `Changelog `_ +-* `Issues `_ +-* `PyPI `_ +-* `Github `_ +-* `User mailing list `_ +-* `Dev mailing list `_ +-* User IRC: `#pypa on Freenode `_ +-* Dev IRC: `#pypa-dev on Freenode `_ +- +- +-Code of Conduct +---------------- +- +-Everyone interacting in the virtualenv project's codebases, issue trackers, +-chat rooms, and mailing lists is expected to follow the +-`PyPA Code of Conduct`_. +- +-.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ +diff --git a/third_party/python/virtualenv/README_MOZILLA b/third_party/python/virtualenv/README_MOZILLA +new file mode 100644 +index 0000000000000..6f40472d9ef22 +--- /dev/null ++++ b/third_party/python/virtualenv/README_MOZILLA +@@ -0,0 +1,10 @@ ++The contents of this directory are extracted from virtualenv.pyz as downloaded ++from https://bootstrap.pypa.io/virtualenv.pyz. ++ ++The virtualenv.py script is a wrapper that should be preserved and allows to ++use the extracted virtualenv.pyz as-is. ++ ++It is not vendored via `mach vendor` because that would require a larger wrapper ++script that handles the same things as the zipapp already does, picking the right ++dependencies to add to the PYTHONPATH depending on the python version. ++ +diff --git a/third_party/python/virtualenv/__main__.py b/third_party/python/virtualenv/__main__.py +new file mode 100644 +index 0000000000000..26825cd3c18bb +--- /dev/null ++++ b/third_party/python/virtualenv/__main__.py +@@ -0,0 +1,168 @@ ++import json ++import os ++import sys ++import zipfile ++ ++ABS_HERE = os.path.abspath(os.path.dirname(__file__)) ++NEW_IMPORT_SYSTEM = sys.version_info[0:2] > (3, 4) ++ ++ ++class VersionPlatformSelect(object): ++ def __init__(self): ++ self.archive = ABS_HERE ++ self._zip_file = zipfile.ZipFile(ABS_HERE, "r") ++ self.modules = self._load("modules.json") ++ self.distributions = self._load("distributions.json") ++ self.__cache = {} ++ ++ def _load(self, of_file): ++ version = ".".join(str(i) for i in sys.version_info[0:2]) ++ per_version = json.loads(self.get_data(of_file).decode("utf-8")) ++ all_platforms = per_version[version] if version in per_version else per_version["3.9"] ++ content = all_platforms.get("==any", {}) # start will all platforms ++ not_us = "!={}".format(sys.platform) ++ for key, value in all_platforms.items(): # now override that with not platform ++ if key.startswith("!=") and key != not_us: ++ content.update(value) ++ content.update(all_platforms.get("=={}".format(sys.platform), {})) # and finish it off with our platform ++ return content ++ ++ def __enter__(self): ++ return self ++ ++ def __exit__(self, exc_type, exc_val, exc_tb): ++ self._zip_file.close() ++ ++ def find_mod(self, fullname): ++ if fullname in self.modules: ++ result = self.modules[fullname] ++ return result ++ ++ def get_filename(self, fullname): ++ zip_path = self.find_mod(fullname) ++ return None if zip_path is None else os.path.join(ABS_HERE, zip_path) ++ ++ def get_data(self, filename): ++ if filename.startswith(ABS_HERE): ++ # keep paths relative from the zipfile ++ filename = filename[len(ABS_HERE) + 1 :] ++ filename = filename.lstrip(os.sep) ++ if sys.platform == "win32": ++ # paths within the zipfile is always /, fixup on Windows to transform \ to / ++ filename = "/".join(filename.split(os.sep)) ++ with self._zip_file.open(filename) as file_handler: ++ return file_handler.read() ++ ++ def find_distributions(self, context): ++ dist_class = versioned_distribution_class() ++ name = context.name ++ if name in self.distributions: ++ result = dist_class(file_loader=self.get_data, dist_path=self.distributions[name]) ++ yield result ++ ++ def __repr__(self): ++ return "{}(path={})".format(self.__class__.__name__, ABS_HERE) ++ ++ def _register_distutils_finder(self): ++ if "distlib" not in self.modules: ++ return ++ ++ class DistlibFinder(object): ++ def __init__(self, path, loader): ++ self.path = path ++ self.loader = loader ++ ++ def find(self, name): ++ class Resource(object): ++ def __init__(self, content): ++ self.bytes = content ++ ++ full_path = os.path.join(self.path, name) ++ return Resource(self.loader.get_data(full_path)) ++ ++ # noinspection PyPackageRequirements ++ from distlib.resources import register_finder ++ ++ register_finder(self, lambda module: DistlibFinder(os.path.dirname(module.__file__), self)) ++ ++ ++_VER_DISTRIBUTION_CLASS = None ++ ++ ++def versioned_distribution_class(): ++ global _VER_DISTRIBUTION_CLASS ++ if _VER_DISTRIBUTION_CLASS is None: ++ if sys.version_info >= (3, 8): ++ # noinspection PyCompatibility ++ from importlib.metadata import Distribution ++ else: ++ # noinspection PyUnresolvedReferences ++ from importlib_metadata import Distribution ++ ++ class VersionedDistribution(Distribution): ++ def __init__(self, file_loader, dist_path): ++ self.file_loader = file_loader ++ self.dist_path = dist_path ++ ++ def read_text(self, filename): ++ return self.file_loader(self.locate_file(filename)).decode("utf-8") ++ ++ def locate_file(self, path): ++ return os.path.join(self.dist_path, path) ++ ++ _VER_DISTRIBUTION_CLASS = VersionedDistribution ++ return _VER_DISTRIBUTION_CLASS ++ ++ ++if NEW_IMPORT_SYSTEM: ++ # noinspection PyCompatibility ++ # noinspection PyCompatibility ++ from importlib.abc import SourceLoader ++ from importlib.util import spec_from_file_location ++ ++ class VersionedFindLoad(VersionPlatformSelect, SourceLoader): ++ def find_spec(self, fullname, path, target=None): ++ zip_path = self.find_mod(fullname) ++ if zip_path is not None: ++ spec = spec_from_file_location(name=fullname, loader=self) ++ return spec ++ ++ def module_repr(self, module): ++ raise NotImplementedError ++ ++ ++else: ++ # noinspection PyDeprecation ++ from imp import new_module ++ ++ class VersionedFindLoad(VersionPlatformSelect): ++ def find_module(self, fullname, path=None): ++ return self if self.find_mod(fullname) else None ++ ++ def load_module(self, fullname): ++ filename = self.get_filename(fullname) ++ code = self.get_data(filename) ++ mod = sys.modules.setdefault(fullname, new_module(fullname)) ++ mod.__file__ = filename ++ mod.__loader__ = self ++ is_package = filename.endswith("__init__.py") ++ if is_package: ++ mod.__path__ = [os.path.dirname(filename)] ++ mod.__package__ = fullname ++ else: ++ mod.__package__ = fullname.rpartition(".")[0] ++ exec(code, mod.__dict__) ++ return mod ++ ++ ++def run(): ++ with VersionedFindLoad() as finder: ++ sys.meta_path.insert(0, finder) ++ finder._register_distutils_finder() ++ from virtualenv.__main__ import run as run_virtualenv ++ ++ run_virtualenv() ++ ++ ++if __name__ == "__main__": ++ run() +diff --git a/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/LICENSE.txt b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/LICENSE.txt +new file mode 100644 +index 0000000000000..107c61405e3b4 +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/LICENSE.txt +@@ -0,0 +1,23 @@ ++# This is the MIT license ++ ++Copyright (c) 2010 ActiveState Software Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining a ++copy of this software and associated documentation files (the ++"Software"), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ++CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ++SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ +diff --git a/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/METADATA b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/METADATA +new file mode 100644 +index 0000000000000..f95073104453f +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/METADATA +@@ -0,0 +1,264 @@ ++Metadata-Version: 2.1 ++Name: appdirs ++Version: 1.4.4 ++Summary: A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". ++Home-page: http://github.com/ActiveState/appdirs ++Author: Trent Mick ++Author-email: trentm@gmail.com ++Maintainer: Jeff Rouse ++Maintainer-email: jr@its.to ++License: MIT ++Keywords: application directory log cache user ++Platform: UNKNOWN ++Classifier: Development Status :: 5 - Production/Stable ++Classifier: Intended Audience :: Developers ++Classifier: License :: OSI Approved :: MIT License ++Classifier: Operating System :: OS Independent ++Classifier: Programming Language :: Python :: 2 ++Classifier: Programming Language :: Python :: 2.7 ++Classifier: Programming Language :: Python :: 3 ++Classifier: Programming Language :: Python :: 3.4 ++Classifier: Programming Language :: Python :: 3.5 ++Classifier: Programming Language :: Python :: 3.6 ++Classifier: Programming Language :: Python :: 3.7 ++Classifier: Programming Language :: Python :: 3.8 ++Classifier: Programming Language :: Python :: Implementation :: PyPy ++Classifier: Programming Language :: Python :: Implementation :: CPython ++Classifier: Topic :: Software Development :: Libraries :: Python Modules ++ ++ ++.. image:: https://secure.travis-ci.org/ActiveState/appdirs.png ++ :target: http://travis-ci.org/ActiveState/appdirs ++ ++the problem ++=========== ++ ++What directory should your app use for storing user data? If running on Mac OS X, you ++should use:: ++ ++ ~/Library/Application Support/ ++ ++If on Windows (at least English Win XP) that should be:: ++ ++ C:\Documents and Settings\\Application Data\Local Settings\\ ++ ++or possibly:: ++ ++ C:\Documents and Settings\\Application Data\\ ++ ++for `roaming profiles `_ but that is another story. ++ ++On Linux (and other Unices) the dir, according to the `XDG ++spec `_, is:: ++ ++ ~/.local/share/ ++ ++ ++``appdirs`` to the rescue ++========================= ++ ++This kind of thing is what the ``appdirs`` module is for. ``appdirs`` will ++help you choose an appropriate: ++ ++- user data dir (``user_data_dir``) ++- user config dir (``user_config_dir``) ++- user cache dir (``user_cache_dir``) ++- site data dir (``site_data_dir``) ++- site config dir (``site_config_dir``) ++- user log dir (``user_log_dir``) ++ ++and also: ++ ++- is a single module so other Python packages can include their own private copy ++- is slightly opinionated on the directory names used. Look for "OPINION" in ++ documentation and code for when an opinion is being applied. ++ ++ ++some example output ++=================== ++ ++On Mac OS X:: ++ ++ >>> from appdirs import * ++ >>> appname = "SuperApp" ++ >>> appauthor = "Acme" ++ >>> user_data_dir(appname, appauthor) ++ '/Users/trentm/Library/Application Support/SuperApp' ++ >>> site_data_dir(appname, appauthor) ++ '/Library/Application Support/SuperApp' ++ >>> user_cache_dir(appname, appauthor) ++ '/Users/trentm/Library/Caches/SuperApp' ++ >>> user_log_dir(appname, appauthor) ++ '/Users/trentm/Library/Logs/SuperApp' ++ ++On Windows 7:: ++ ++ >>> from appdirs import * ++ >>> appname = "SuperApp" ++ >>> appauthor = "Acme" ++ >>> user_data_dir(appname, appauthor) ++ 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp' ++ >>> user_data_dir(appname, appauthor, roaming=True) ++ 'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp' ++ >>> user_cache_dir(appname, appauthor) ++ 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache' ++ >>> user_log_dir(appname, appauthor) ++ 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs' ++ ++On Linux:: ++ ++ >>> from appdirs import * ++ >>> appname = "SuperApp" ++ >>> appauthor = "Acme" ++ >>> user_data_dir(appname, appauthor) ++ '/home/trentm/.local/share/SuperApp ++ >>> site_data_dir(appname, appauthor) ++ '/usr/local/share/SuperApp' ++ >>> site_data_dir(appname, appauthor, multipath=True) ++ '/usr/local/share/SuperApp:/usr/share/SuperApp' ++ >>> user_cache_dir(appname, appauthor) ++ '/home/trentm/.cache/SuperApp' ++ >>> user_log_dir(appname, appauthor) ++ '/home/trentm/.cache/SuperApp/log' ++ >>> user_config_dir(appname) ++ '/home/trentm/.config/SuperApp' ++ >>> site_config_dir(appname) ++ '/etc/xdg/SuperApp' ++ >>> os.environ['XDG_CONFIG_DIRS'] = '/etc:/usr/local/etc' ++ >>> site_config_dir(appname, multipath=True) ++ '/etc/SuperApp:/usr/local/etc/SuperApp' ++ ++ ++``AppDirs`` for convenience ++=========================== ++ ++:: ++ ++ >>> from appdirs import AppDirs ++ >>> dirs = AppDirs("SuperApp", "Acme") ++ >>> dirs.user_data_dir ++ '/Users/trentm/Library/Application Support/SuperApp' ++ >>> dirs.site_data_dir ++ '/Library/Application Support/SuperApp' ++ >>> dirs.user_cache_dir ++ '/Users/trentm/Library/Caches/SuperApp' ++ >>> dirs.user_log_dir ++ '/Users/trentm/Library/Logs/SuperApp' ++ ++ ++ ++Per-version isolation ++===================== ++ ++If you have multiple versions of your app in use that you want to be ++able to run side-by-side, then you may want version-isolation for these ++dirs:: ++ ++ >>> from appdirs import AppDirs ++ >>> dirs = AppDirs("SuperApp", "Acme", version="1.0") ++ >>> dirs.user_data_dir ++ '/Users/trentm/Library/Application Support/SuperApp/1.0' ++ >>> dirs.site_data_dir ++ '/Library/Application Support/SuperApp/1.0' ++ >>> dirs.user_cache_dir ++ '/Users/trentm/Library/Caches/SuperApp/1.0' ++ >>> dirs.user_log_dir ++ '/Users/trentm/Library/Logs/SuperApp/1.0' ++ ++ ++ ++appdirs Changelog ++================= ++ ++appdirs 1.4.4 ++------------- ++- [PR #92] Don't import appdirs from setup.py ++ ++Project officially classified as Stable which is important ++for inclusion in other distros such as ActivePython. ++ ++First of several incremental releases to catch up on maintenance. ++ ++appdirs 1.4.3 ++------------- ++- [PR #76] Python 3.6 invalid escape sequence deprecation fixes ++- Fix for Python 3.6 support ++ ++appdirs 1.4.2 ++------------- ++- [PR #84] Allow installing without setuptools ++- [PR #86] Fix string delimiters in setup.py description ++- Add Python 3.6 support ++ ++appdirs 1.4.1 ++------------- ++- [issue #38] Fix _winreg import on Windows Py3 ++- [issue #55] Make appname optional ++ ++appdirs 1.4.0 ++------------- ++- [PR #42] AppAuthor is now optional on Windows ++- [issue 41] Support Jython on Windows, Mac, and Unix-like platforms. Windows ++ support requires `JNA `_. ++- [PR #44] Fix incorrect behaviour of the site_config_dir method ++ ++appdirs 1.3.0 ++------------- ++- [Unix, issue 16] Conform to XDG standard, instead of breaking it for ++ everybody ++- [Unix] Removes gratuitous case mangling of the case, since \*nix-es are ++ usually case sensitive, so mangling is not wise ++- [Unix] Fixes the utterly wrong behaviour in ``site_data_dir``, return result ++ based on XDG_DATA_DIRS and make room for respecting the standard which ++ specifies XDG_DATA_DIRS is a multiple-value variable ++- [Issue 6] Add ``*_config_dir`` which are distinct on nix-es, according to ++ XDG specs; on Windows and Mac return the corresponding ``*_data_dir`` ++ ++appdirs 1.2.0 ++------------- ++ ++- [Unix] Put ``user_log_dir`` under the *cache* dir on Unix. Seems to be more ++ typical. ++- [issue 9] Make ``unicode`` work on py3k. ++ ++appdirs 1.1.0 ++------------- ++ ++- [issue 4] Add ``AppDirs.user_log_dir``. ++- [Unix, issue 2, issue 7] appdirs now conforms to `XDG base directory spec ++ `_. ++- [Mac, issue 5] Fix ``site_data_dir()`` on Mac. ++- [Mac] Drop use of 'Carbon' module in favour of hardcoded paths; supports ++ Python3 now. ++- [Windows] Append "Cache" to ``user_cache_dir`` on Windows by default. Use ++ ``opinion=False`` option to disable this. ++- Add ``appdirs.AppDirs`` convenience class. Usage: ++ ++ >>> dirs = AppDirs("SuperApp", "Acme", version="1.0") ++ >>> dirs.user_data_dir ++ '/Users/trentm/Library/Application Support/SuperApp/1.0' ++ ++- [Windows] Cherry-pick Komodo's change to downgrade paths to the Windows short ++ paths if there are high bit chars. ++- [Linux] Change default ``user_cache_dir()`` on Linux to be singular, e.g. ++ "~/.superapp/cache". ++- [Windows] Add ``roaming`` option to ``user_data_dir()`` (for use on Windows only) ++ and change the default ``user_data_dir`` behaviour to use a *non*-roaming ++ profile dir (``CSIDL_LOCAL_APPDATA`` instead of ``CSIDL_APPDATA``). Why? Because ++ a large roaming profile can cause login speed issues. The "only syncs on ++ logout" behaviour can cause surprises in appdata info. ++ ++ ++appdirs 1.0.1 (never released) ++------------------------------ ++ ++Started this changelog 27 July 2010. Before that this module originated in the ++`Komodo `_ product as ``applib.py`` and then ++as `applib/location.py ++`_ (used by ++`PyPM `_ in `ActivePython ++`_). This is basically a fork of ++applib.py 1.0.1 and applib/location.py 1.0.1. ++ ++ ++ +diff --git a/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/RECORD b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/RECORD +new file mode 100644 +index 0000000000000..9cbb30620ebfe +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/RECORD +@@ -0,0 +1,6 @@ ++appdirs.py,sha256=g99s2sXhnvTEm79oj4bWI0Toapc-_SmKKNXvOXHkVic,24720 ++appdirs-1.4.4.dist-info/LICENSE.txt,sha256=Nt200KdFqTqyAyA9cZCBSxuJcn0lTK_0jHp6-71HAAs,1097 ++appdirs-1.4.4.dist-info/METADATA,sha256=k5TVfXMNKGHTfp2wm6EJKTuGwGNuoQR5TqQgH8iwG8M,8981 ++appdirs-1.4.4.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 ++appdirs-1.4.4.dist-info/top_level.txt,sha256=nKncE8CUqZERJ6VuQWL4_bkunSPDNfn7KZqb4Tr5YEM,8 ++appdirs-1.4.4.dist-info/RECORD,, +diff --git a/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/WHEEL b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/WHEEL +new file mode 100644 +index 0000000000000..ef99c6cf3283b +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/WHEEL +@@ -0,0 +1,6 @@ ++Wheel-Version: 1.0 ++Generator: bdist_wheel (0.34.2) ++Root-Is-Purelib: true ++Tag: py2-none-any ++Tag: py3-none-any ++ +diff --git a/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/top_level.txt b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/top_level.txt +new file mode 100644 +index 0000000000000..d64bc321a11c1 +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs-1.4.4.dist-info/top_level.txt +@@ -0,0 +1 @@ ++appdirs +diff --git a/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py +new file mode 100644 +index 0000000000000..2acd1debeb1d3 +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/appdirs-1.4.4-py2.py3-none-any/appdirs.py +@@ -0,0 +1,608 @@ ++#!/usr/bin/env python ++# -*- coding: utf-8 -*- ++# Copyright (c) 2005-2010 ActiveState Software Inc. ++# Copyright (c) 2013 Eddy Petrișor ++ ++"""Utilities for determining application-specific dirs. ++ ++See for details and usage. ++""" ++# Dev Notes: ++# - MSDN on where to store app data files: ++# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 ++# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html ++# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html ++ ++__version__ = "1.4.4" ++__version_info__ = tuple(int(segment) for segment in __version__.split(".")) ++ ++ ++import sys ++import os ++ ++PY3 = sys.version_info[0] == 3 ++ ++if PY3: ++ unicode = str ++ ++if sys.platform.startswith('java'): ++ import platform ++ os_name = platform.java_ver()[3][0] ++ if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. ++ system = 'win32' ++ elif os_name.startswith('Mac'): # "Mac OS X", etc. ++ system = 'darwin' ++ else: # "Linux", "SunOS", "FreeBSD", etc. ++ # Setting this to "linux2" is not ideal, but only Windows or Mac ++ # are actually checked for and the rest of the module expects ++ # *sys.platform* style strings. ++ system = 'linux2' ++else: ++ system = sys.platform ++ ++ ++ ++def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): ++ r"""Return full path to the user-specific data dir for this application. ++ ++ "appname" is the name of application. ++ If None, just the system directory is returned. ++ "appauthor" (only used on Windows) is the name of the ++ appauthor or distributing body for this application. Typically ++ it is the owning company name. This falls back to appname. You may ++ pass False to disable it. ++ "version" is an optional version path element to append to the ++ path. You might want to use this if you want multiple versions ++ of your app to be able to run independently. If used, this ++ would typically be ".". ++ Only applied when appname is present. ++ "roaming" (boolean, default False) can be set True to use the Windows ++ roaming appdata directory. That means that for users on a Windows ++ network setup for roaming profiles, this user data will be ++ sync'd on login. See ++ ++ for a discussion of issues. ++ ++ Typical user data directories are: ++ Mac OS X: ~/Library/Application Support/ ++ Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined ++ Win XP (not roaming): C:\Documents and Settings\\Application Data\\ ++ Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ ++ Win 7 (not roaming): C:\Users\\AppData\Local\\ ++ Win 7 (roaming): C:\Users\\AppData\Roaming\\ ++ ++ For Unix, we follow the XDG spec and support $XDG_DATA_HOME. ++ That means, by default "~/.local/share/". ++ """ ++ if system == "win32": ++ if appauthor is None: ++ appauthor = appname ++ const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" ++ path = os.path.normpath(_get_win_folder(const)) ++ if appname: ++ if appauthor is not False: ++ path = os.path.join(path, appauthor, appname) ++ else: ++ path = os.path.join(path, appname) ++ elif system == 'darwin': ++ path = os.path.expanduser('~/Library/Application Support/') ++ if appname: ++ path = os.path.join(path, appname) ++ else: ++ path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) ++ if appname: ++ path = os.path.join(path, appname) ++ if appname and version: ++ path = os.path.join(path, version) ++ return path ++ ++ ++def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): ++ r"""Return full path to the user-shared data dir for this application. ++ ++ "appname" is the name of application. ++ If None, just the system directory is returned. ++ "appauthor" (only used on Windows) is the name of the ++ appauthor or distributing body for this application. Typically ++ it is the owning company name. This falls back to appname. You may ++ pass False to disable it. ++ "version" is an optional version path element to append to the ++ path. You might want to use this if you want multiple versions ++ of your app to be able to run independently. If used, this ++ would typically be ".". ++ Only applied when appname is present. ++ "multipath" is an optional parameter only applicable to *nix ++ which indicates that the entire list of data dirs should be ++ returned. By default, the first item from XDG_DATA_DIRS is ++ returned, or '/usr/local/share/', ++ if XDG_DATA_DIRS is not set ++ ++ Typical site data directories are: ++ Mac OS X: /Library/Application Support/ ++ Unix: /usr/local/share/ or /usr/share/ ++ Win XP: C:\Documents and Settings\All Users\Application Data\\ ++ Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) ++ Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. ++ ++ For Unix, this is using the $XDG_DATA_DIRS[0] default. ++ ++ WARNING: Do not use this on Windows. See the Vista-Fail note above for why. ++ """ ++ if system == "win32": ++ if appauthor is None: ++ appauthor = appname ++ path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) ++ if appname: ++ if appauthor is not False: ++ path = os.path.join(path, appauthor, appname) ++ else: ++ path = os.path.join(path, appname) ++ elif system == 'darwin': ++ path = os.path.expanduser('/Library/Application Support') ++ if appname: ++ path = os.path.join(path, appname) ++ else: ++ # XDG default for $XDG_DATA_DIRS ++ # only first, if multipath is False ++ path = os.getenv('XDG_DATA_DIRS', ++ os.pathsep.join(['/usr/local/share', '/usr/share'])) ++ pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] ++ if appname: ++ if version: ++ appname = os.path.join(appname, version) ++ pathlist = [os.sep.join([x, appname]) for x in pathlist] ++ ++ if multipath: ++ path = os.pathsep.join(pathlist) ++ else: ++ path = pathlist[0] ++ return path ++ ++ if appname and version: ++ path = os.path.join(path, version) ++ return path ++ ++ ++def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): ++ r"""Return full path to the user-specific config dir for this application. ++ ++ "appname" is the name of application. ++ If None, just the system directory is returned. ++ "appauthor" (only used on Windows) is the name of the ++ appauthor or distributing body for this application. Typically ++ it is the owning company name. This falls back to appname. You may ++ pass False to disable it. ++ "version" is an optional version path element to append to the ++ path. You might want to use this if you want multiple versions ++ of your app to be able to run independently. If used, this ++ would typically be ".". ++ Only applied when appname is present. ++ "roaming" (boolean, default False) can be set True to use the Windows ++ roaming appdata directory. That means that for users on a Windows ++ network setup for roaming profiles, this user data will be ++ sync'd on login. See ++ ++ for a discussion of issues. ++ ++ Typical user config directories are: ++ Mac OS X: same as user_data_dir ++ Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined ++ Win *: same as user_data_dir ++ ++ For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. ++ That means, by default "~/.config/". ++ """ ++ if system in ["win32", "darwin"]: ++ path = user_data_dir(appname, appauthor, None, roaming) ++ else: ++ path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) ++ if appname: ++ path = os.path.join(path, appname) ++ if appname and version: ++ path = os.path.join(path, version) ++ return path ++ ++ ++def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): ++ r"""Return full path to the user-shared data dir for this application. ++ ++ "appname" is the name of application. ++ If None, just the system directory is returned. ++ "appauthor" (only used on Windows) is the name of the ++ appauthor or distributing body for this application. Typically ++ it is the owning company name. This falls back to appname. You may ++ pass False to disable it. ++ "version" is an optional version path element to append to the ++ path. You might want to use this if you want multiple versions ++ of your app to be able to run independently. If used, this ++ would typically be ".". ++ Only applied when appname is present. ++ "multipath" is an optional parameter only applicable to *nix ++ which indicates that the entire list of config dirs should be ++ returned. By default, the first item from XDG_CONFIG_DIRS is ++ returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set ++ ++ Typical site config directories are: ++ Mac OS X: same as site_data_dir ++ Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in ++ $XDG_CONFIG_DIRS ++ Win *: same as site_data_dir ++ Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) ++ ++ For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False ++ ++ WARNING: Do not use this on Windows. See the Vista-Fail note above for why. ++ """ ++ if system in ["win32", "darwin"]: ++ path = site_data_dir(appname, appauthor) ++ if appname and version: ++ path = os.path.join(path, version) ++ else: ++ # XDG default for $XDG_CONFIG_DIRS ++ # only first, if multipath is False ++ path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') ++ pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] ++ if appname: ++ if version: ++ appname = os.path.join(appname, version) ++ pathlist = [os.sep.join([x, appname]) for x in pathlist] ++ ++ if multipath: ++ path = os.pathsep.join(pathlist) ++ else: ++ path = pathlist[0] ++ return path ++ ++ ++def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): ++ r"""Return full path to the user-specific cache dir for this application. ++ ++ "appname" is the name of application. ++ If None, just the system directory is returned. ++ "appauthor" (only used on Windows) is the name of the ++ appauthor or distributing body for this application. Typically ++ it is the owning company name. This falls back to appname. You may ++ pass False to disable it. ++ "version" is an optional version path element to append to the ++ path. You might want to use this if you want multiple versions ++ of your app to be able to run independently. If used, this ++ would typically be ".". ++ Only applied when appname is present. ++ "opinion" (boolean) can be False to disable the appending of ++ "Cache" to the base app data dir for Windows. See ++ discussion below. ++ ++ Typical user cache directories are: ++ Mac OS X: ~/Library/Caches/ ++ Unix: ~/.cache/ (XDG default) ++ Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache ++ Vista: C:\Users\\AppData\Local\\\Cache ++ ++ On Windows the only suggestion in the MSDN docs is that local settings go in ++ the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming ++ app data dir (the default returned by `user_data_dir` above). Apps typically ++ put cache data somewhere *under* the given dir here. Some examples: ++ ...\Mozilla\Firefox\Profiles\\Cache ++ ...\Acme\SuperApp\Cache\1.0 ++ OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. ++ This can be disabled with the `opinion=False` option. ++ """ ++ if system == "win32": ++ if appauthor is None: ++ appauthor = appname ++ path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) ++ if appname: ++ if appauthor is not False: ++ path = os.path.join(path, appauthor, appname) ++ else: ++ path = os.path.join(path, appname) ++ if opinion: ++ path = os.path.join(path, "Cache") ++ elif system == 'darwin': ++ path = os.path.expanduser('~/Library/Caches') ++ if appname: ++ path = os.path.join(path, appname) ++ else: ++ path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) ++ if appname: ++ path = os.path.join(path, appname) ++ if appname and version: ++ path = os.path.join(path, version) ++ return path ++ ++ ++def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): ++ r"""Return full path to the user-specific state dir for this application. ++ ++ "appname" is the name of application. ++ If None, just the system directory is returned. ++ "appauthor" (only used on Windows) is the name of the ++ appauthor or distributing body for this application. Typically ++ it is the owning company name. This falls back to appname. You may ++ pass False to disable it. ++ "version" is an optional version path element to append to the ++ path. You might want to use this if you want multiple versions ++ of your app to be able to run independently. If used, this ++ would typically be ".". ++ Only applied when appname is present. ++ "roaming" (boolean, default False) can be set True to use the Windows ++ roaming appdata directory. That means that for users on a Windows ++ network setup for roaming profiles, this user data will be ++ sync'd on login. See ++ ++ for a discussion of issues. ++ ++ Typical user state directories are: ++ Mac OS X: same as user_data_dir ++ Unix: ~/.local/state/ # or in $XDG_STATE_HOME, if defined ++ Win *: same as user_data_dir ++ ++ For Unix, we follow this Debian proposal ++ to extend the XDG spec and support $XDG_STATE_HOME. ++ ++ That means, by default "~/.local/state/". ++ """ ++ if system in ["win32", "darwin"]: ++ path = user_data_dir(appname, appauthor, None, roaming) ++ else: ++ path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) ++ if appname: ++ path = os.path.join(path, appname) ++ if appname and version: ++ path = os.path.join(path, version) ++ return path ++ ++ ++def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): ++ r"""Return full path to the user-specific log dir for this application. ++ ++ "appname" is the name of application. ++ If None, just the system directory is returned. ++ "appauthor" (only used on Windows) is the name of the ++ appauthor or distributing body for this application. Typically ++ it is the owning company name. This falls back to appname. You may ++ pass False to disable it. ++ "version" is an optional version path element to append to the ++ path. You might want to use this if you want multiple versions ++ of your app to be able to run independently. If used, this ++ would typically be ".". ++ Only applied when appname is present. ++ "opinion" (boolean) can be False to disable the appending of ++ "Logs" to the base app data dir for Windows, and "log" to the ++ base cache dir for Unix. See discussion below. ++ ++ Typical user log directories are: ++ Mac OS X: ~/Library/Logs/ ++ Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined ++ Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs ++ Vista: C:\Users\\AppData\Local\\\Logs ++ ++ On Windows the only suggestion in the MSDN docs is that local settings ++ go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in ++ examples of what some windows apps use for a logs dir.) ++ ++ OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` ++ value for Windows and appends "log" to the user cache dir for Unix. ++ This can be disabled with the `opinion=False` option. ++ """ ++ if system == "darwin": ++ path = os.path.join( ++ os.path.expanduser('~/Library/Logs'), ++ appname) ++ elif system == "win32": ++ path = user_data_dir(appname, appauthor, version) ++ version = False ++ if opinion: ++ path = os.path.join(path, "Logs") ++ else: ++ path = user_cache_dir(appname, appauthor, version) ++ version = False ++ if opinion: ++ path = os.path.join(path, "log") ++ if appname and version: ++ path = os.path.join(path, version) ++ return path ++ ++ ++class AppDirs(object): ++ """Convenience wrapper for getting application dirs.""" ++ def __init__(self, appname=None, appauthor=None, version=None, ++ roaming=False, multipath=False): ++ self.appname = appname ++ self.appauthor = appauthor ++ self.version = version ++ self.roaming = roaming ++ self.multipath = multipath ++ ++ @property ++ def user_data_dir(self): ++ return user_data_dir(self.appname, self.appauthor, ++ version=self.version, roaming=self.roaming) ++ ++ @property ++ def site_data_dir(self): ++ return site_data_dir(self.appname, self.appauthor, ++ version=self.version, multipath=self.multipath) ++ ++ @property ++ def user_config_dir(self): ++ return user_config_dir(self.appname, self.appauthor, ++ version=self.version, roaming=self.roaming) ++ ++ @property ++ def site_config_dir(self): ++ return site_config_dir(self.appname, self.appauthor, ++ version=self.version, multipath=self.multipath) ++ ++ @property ++ def user_cache_dir(self): ++ return user_cache_dir(self.appname, self.appauthor, ++ version=self.version) ++ ++ @property ++ def user_state_dir(self): ++ return user_state_dir(self.appname, self.appauthor, ++ version=self.version) ++ ++ @property ++ def user_log_dir(self): ++ return user_log_dir(self.appname, self.appauthor, ++ version=self.version) ++ ++ ++#---- internal support stuff ++ ++def _get_win_folder_from_registry(csidl_name): ++ """This is a fallback technique at best. I'm not sure if using the ++ registry for this guarantees us the correct answer for all CSIDL_* ++ names. ++ """ ++ if PY3: ++ import winreg as _winreg ++ else: ++ import _winreg ++ ++ shell_folder_name = { ++ "CSIDL_APPDATA": "AppData", ++ "CSIDL_COMMON_APPDATA": "Common AppData", ++ "CSIDL_LOCAL_APPDATA": "Local AppData", ++ }[csidl_name] ++ ++ key = _winreg.OpenKey( ++ _winreg.HKEY_CURRENT_USER, ++ r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" ++ ) ++ dir, type = _winreg.QueryValueEx(key, shell_folder_name) ++ return dir ++ ++ ++def _get_win_folder_with_pywin32(csidl_name): ++ from win32com.shell import shellcon, shell ++ dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) ++ # Try to make this a unicode path because SHGetFolderPath does ++ # not return unicode strings when there is unicode data in the ++ # path. ++ try: ++ dir = unicode(dir) ++ ++ # Downgrade to short path name if have highbit chars. See ++ # . ++ has_high_char = False ++ for c in dir: ++ if ord(c) > 255: ++ has_high_char = True ++ break ++ if has_high_char: ++ try: ++ import win32api ++ dir = win32api.GetShortPathName(dir) ++ except ImportError: ++ pass ++ except UnicodeError: ++ pass ++ return dir ++ ++ ++def _get_win_folder_with_ctypes(csidl_name): ++ import ctypes ++ ++ csidl_const = { ++ "CSIDL_APPDATA": 26, ++ "CSIDL_COMMON_APPDATA": 35, ++ "CSIDL_LOCAL_APPDATA": 28, ++ }[csidl_name] ++ ++ buf = ctypes.create_unicode_buffer(1024) ++ ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) ++ ++ # Downgrade to short path name if have highbit chars. See ++ # . ++ has_high_char = False ++ for c in buf: ++ if ord(c) > 255: ++ has_high_char = True ++ break ++ if has_high_char: ++ buf2 = ctypes.create_unicode_buffer(1024) ++ if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): ++ buf = buf2 ++ ++ return buf.value ++ ++def _get_win_folder_with_jna(csidl_name): ++ import array ++ from com.sun import jna ++ from com.sun.jna.platform import win32 ++ ++ buf_size = win32.WinDef.MAX_PATH * 2 ++ buf = array.zeros('c', buf_size) ++ shell = win32.Shell32.INSTANCE ++ shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) ++ dir = jna.Native.toString(buf.tostring()).rstrip("\0") ++ ++ # Downgrade to short path name if have highbit chars. See ++ # . ++ has_high_char = False ++ for c in dir: ++ if ord(c) > 255: ++ has_high_char = True ++ break ++ if has_high_char: ++ buf = array.zeros('c', buf_size) ++ kernel = win32.Kernel32.INSTANCE ++ if kernel.GetShortPathName(dir, buf, buf_size): ++ dir = jna.Native.toString(buf.tostring()).rstrip("\0") ++ ++ return dir ++ ++if system == "win32": ++ try: ++ import win32com.shell ++ _get_win_folder = _get_win_folder_with_pywin32 ++ except ImportError: ++ try: ++ from ctypes import windll ++ _get_win_folder = _get_win_folder_with_ctypes ++ except ImportError: ++ try: ++ import com.sun.jna ++ _get_win_folder = _get_win_folder_with_jna ++ except ImportError: ++ _get_win_folder = _get_win_folder_from_registry ++ ++ ++#---- self test code ++ ++if __name__ == "__main__": ++ appname = "MyApp" ++ appauthor = "MyCompany" ++ ++ props = ("user_data_dir", ++ "user_config_dir", ++ "user_cache_dir", ++ "user_state_dir", ++ "user_log_dir", ++ "site_data_dir", ++ "site_config_dir") ++ ++ print("-- app dirs %s --" % __version__) ++ ++ print("-- app dirs (with optional 'version')") ++ dirs = AppDirs(appname, appauthor, version="1.0") ++ for prop in props: ++ print("%s: %s" % (prop, getattr(dirs, prop))) ++ ++ print("\n-- app dirs (without optional 'version')") ++ dirs = AppDirs(appname, appauthor) ++ for prop in props: ++ print("%s: %s" % (prop, getattr(dirs, prop))) ++ ++ print("\n-- app dirs (without optional 'appauthor')") ++ dirs = AppDirs(appname) ++ for prop in props: ++ print("%s: %s" % (prop, getattr(dirs, prop))) ++ ++ print("\n-- app dirs (with disabled 'appauthor')") ++ dirs = AppDirs(appname, appauthor=False) ++ for prop in props: ++ print("%s: %s" % (prop, getattr(dirs, prop))) +diff --git a/third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/__init__.py b/third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/__init__.py +new file mode 100644 +index 0000000000000..1fc3c62e81632 +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/__init__.py +@@ -0,0 +1,6 @@ ++# A Python "namespace package" http://www.python.org/dev/peps/pep-0382/ ++# This always goes inside of a namespace package's __init__.py ++ ++from pkgutil import extend_path ++ ++__path__ = extend_path(__path__, __name__) +diff --git a/third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/__init__.py b/third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/__init__.py +new file mode 100644 +index 0000000000000..603d604764029 +--- /dev/null ++++ b/third_party/python/virtualenv/__virtualenv__/configparser-4.0.2-py2.py3-none-any/backports/configparser/__init__.py +@@ -0,0 +1,1473 @@ ++#!/usr/bin/env python ++# -*- coding: utf-8 -*- ++# flake8: noqa ++ ++"""Configuration file parser. ++ ++A configuration file consists of sections, lead by a "[section]" header, ++and followed by "name: value" entries, with continuations and such in ++the style of RFC 822. ++ ++Intrinsic defaults can be specified by passing them into the ++ConfigParser constructor as a dictionary. ++ ++class: ++ ++ConfigParser -- responsible for parsing a list of ++ configuration files, and managing the parsed database. ++ ++ methods: ++ ++ __init__(defaults=None, dict_type=_default_dict, allow_no_value=False, ++ delimiters=('=', ':'), comment_prefixes=('#', ';'), ++ inline_comment_prefixes=None, strict=True, ++ empty_lines_in_values=True, default_section='DEFAULT', ++ interpolation=, converters=): ++ Create the parser. When `defaults' is given, it is initialized into the ++ dictionary or intrinsic defaults. The keys must be strings, the values ++ must be appropriate for %()s string interpolation. ++ ++ When `dict_type' is given, it will be used to create the dictionary ++ objects for the list of sections, for the options within a section, and ++ for the default values. ++ ++ When `delimiters' is given, it will be used as the set of substrings ++ that divide keys from values. ++ ++ When `comment_prefixes' is given, it will be used as the set of ++ substrings that prefix comments in empty lines. Comments can be ++ indented. ++ ++ When `inline_comment_prefixes' is given, it will be used as the set of ++ substrings that prefix comments in non-empty lines. ++ ++ When `strict` is True, the parser won't allow for any section or option ++ duplicates while reading from a single source (file, string or ++ dictionary). Default is True. ++ ++ When `empty_lines_in_values' is False (default: True), each empty line ++ marks the end of an option. Otherwise, internal empty lines of ++ a multiline option are kept as part of the value. ++ ++ When `allow_no_value' is True (default: False), options without ++ values are accepted; the value presented for these is None. ++ ++ When `default_section' is given, the name of the special section is ++ named accordingly. By default it is called ``"DEFAULT"`` but this can ++ be customized to point to any other valid section name. Its current ++ value can be retrieved using the ``parser_instance.default_section`` ++ attribute and may be modified at runtime. ++ ++ When `interpolation` is given, it should be an Interpolation subclass ++ instance. It will be used as the handler for option value ++ pre-processing when using getters. RawConfigParser objects don't do ++ any sort of interpolation, whereas ConfigParser uses an instance of ++ BasicInterpolation. The library also provides a ``zc.buildbot`` ++ inspired ExtendedInterpolation implementation. ++ ++ When `converters` is given, it should be a dictionary where each key ++ represents the name of a type converter and each value is a callable ++ implementing the conversion from string to the desired datatype. Every ++ converter gets its corresponding get*() method on the parser object and ++ section proxies. ++ ++ sections() ++ Return all the configuration section names, sans DEFAULT. ++ ++ has_section(section) ++ Return whether the given section exists. ++ ++ has_option(section, option) ++ Return whether the given option exists in the given section. ++ ++ options(section) ++ Return list of configuration options for the named section. ++ ++ read(filenames, encoding=None) ++ Read and parse the iterable of named configuration files, given by ++ name. A single filename is also allowed. Non-existing files ++ are ignored. Return list of successfully read files. ++ ++ read_file(f, filename=None) ++ Read and parse one configuration file, given as a file object. ++ The filename defaults to f.name; it is only used in error ++ messages (if f has no `name' attribute, the string `' is used). ++ ++ read_string(string) ++ Read configuration from a given string. ++ ++ read_dict(dictionary) ++ Read configuration from a dictionary. Keys are section names, ++ values are dictionaries with keys and values that should be present ++ in the section. If the used dictionary type preserves order, sections ++ and their keys will be added in order. Values are automatically ++ converted to strings. ++ ++ get(section, option, raw=False, vars=None, fallback=_UNSET) ++ Return a string value for the named option. All % interpolations are ++ expanded in the return values, based on the defaults passed into the ++ constructor and the DEFAULT section. Additional substitutions may be ++ provided using the `vars' argument, which must be a dictionary whose ++ contents override any pre-existing defaults. If `option' is a key in ++ `vars', the value from `vars' is used. ++ ++ getint(section, options, raw=False, vars=None, fallback=_UNSET) ++ Like get(), but convert value to an integer. ++ ++ getfloat(section, options, raw=False, vars=None, fallback=_UNSET) ++ Like get(), but convert value to a float. ++ ++ getboolean(section, options, raw=False, vars=None, fallback=_UNSET) ++ Like get(), but convert value to a boolean (currently case ++ insensitively defined as 0, false, no, off for False, and 1, true, ++ yes, on for True). Returns False or True. ++ ++ items(section=_UNSET, raw=False, vars=None) ++ If section is given, return a list of tuples with (name, value) for ++ each option in the section. Otherwise, return a list of tuples with ++ (section_name, section_proxy) for each section, including DEFAULTSECT. ++ ++ remove_section(section) ++ Remove the given file section and all its options. ++ ++ remove_option(section, option) ++ Remove the given option from the given section. ++ ++ set(section, option, value) ++ Set the given option. ++ ++ write(fp, space_around_delimiters=True) ++ Write the configuration state in .ini format. If ++ `space_around_delimiters' is True (the default), delimiters ++ between keys and values are surrounded by spaces. ++""" ++ ++from __future__ import absolute_import ++from __future__ import division ++from __future__ import print_function ++from __future__ import unicode_literals ++ ++try: ++ from collections.abc import MutableMapping ++except ImportError: ++ from collections import MutableMapping ++import functools ++import io ++import itertools ++import os ++import re ++import sys ++import warnings ++ ++from backports.configparser.helpers import OrderedDict as _default_dict ++from backports.configparser.helpers import ChainMap as _ChainMap ++from backports.configparser.helpers import from_none, open, str, PY2 ++from backports.configparser.helpers import PathLike, fspath ++from backports.configparser.helpers import MutableMapping ++ ++__all__ = [ ++ "NoSectionError", ++ "DuplicateOptionError", ++ "DuplicateSectionError", ++ "NoOptionError", ++ "InterpolationError", ++ "InterpolationDepthError", ++ "InterpolationMissingOptionError", ++ "InterpolationSyntaxError", ++ "ParsingError", ++ "MissingSectionHeaderError", ++ "ConfigParser", ++ "SafeConfigParser", ++ "RawConfigParser", ++ "Interpolation", ++ "BasicInterpolation", ++ "ExtendedInterpolation", ++ "LegacyInterpolation", ++ "SectionProxy", ++ "ConverterMapping", ++ "DEFAULTSECT", ++ "MAX_INTERPOLATION_DEPTH", ++] ++ ++DEFAULTSECT = "DEFAULT" ++ ++MAX_INTERPOLATION_DEPTH = 10 ++ ++ ++# exception classes ++class Error(Exception): ++ """Base class for ConfigParser exceptions.""" ++ ++ def __init__(self, msg=''): ++ self.message = msg ++ Exception.__init__(self, msg) ++ ++ def __repr__(self): ++ return self.message ++ ++ __str__ = __repr__ ++ ++ ++class NoSectionError(Error): ++ """Raised when no section matches a requested option.""" ++ ++ def __init__(self, section): ++ Error.__init__(self, 'No section: %r' % (section,)) ++ self.section = section ++ self.args = (section,) ++ ++ ++class DuplicateSectionError(Error): ++ """Raised when a section is repeated in an input source. ++ ++ Possible repetitions that raise this exception are: multiple creation ++ using the API or in strict parsers when a section is found more than once ++ in a single input file, string or dictionary. ++ """ ++ ++ def __init__(self, section, source=None, lineno=None): ++ msg = [repr(section), " already exists"] ++ if source is not None: ++ message = ["While reading from ", repr(source)] ++ if lineno is not None: ++ message.append(" [line {0:2d}]".format(lineno)) ++ message.append(": section ") ++ message.extend(msg) ++ msg = message ++ else: ++ msg.insert(0, "Section ") ++ Error.__init__(self, "".join(msg)) ++ self.section = section ++ self.source = source ++ self.lineno = lineno ++ self.args = (section, source, lineno) ++ ++ ++class DuplicateOptionError(Error): ++ """Raised by strict parsers when an option is repeated in an input source. ++ ++ Current implementation raises this exception only when an option is found ++ more than once in a single file, string or dictionary. ++ """ ++ ++ def __init__(self, section, option, source=None, lineno=None): ++ msg = [repr(option), " in section ", repr(section), " already exists"] ++ if source is not None: ++ message = ["While reading from ", repr(source)] ++ if lineno is not None: ++ message.append(" [line {0:2d}]".format(lineno)) ++ message.append(": option ") ++ message.extend(msg) ++ msg = message ++ else: ++ msg.insert(0, "Option ") ++ Error.__init__(self, "".join(msg)) ++ self.section = section ++ self.option = option ++ self.source = source ++ self.lineno = lineno ++ self.args = (section, option, source, lineno) ++ ++ ++class NoOptionError(Error): ++ """A requested option was not found.""" ++ ++ def __init__(self, option, section): ++ Error.__init__(self, "No option %r in section: %r" % (option, section)) ++ self.option = option ++ self.section = section ++ self.args = (option, section) ++ ++ ++class InterpolationError(Error): ++ """Base class for interpolation-related exceptions.""" ++ ++ def __init__(self, option, section, msg): ++ Error.__init__(self, msg) ++ self.option = option ++ self.section = section ++ self.args = (option, section, msg) ++ ++ ++class InterpolationMissingOptionError(InterpolationError): ++ """A string substitution required a setting which was not available.""" ++ ++ def __init__(self, option, section, rawval, reference): ++ msg = ( ++ "Bad value substitution: option {0!r} in section {1!r} contains " ++ "an interpolation key {2!r} which is not a valid option name. " ++ "Raw value: {3!r}".format(option, section, reference, rawval) ++ ) ++ InterpolationError.__init__(self, option, section, msg) ++ self.reference = reference ++ self.args = (option, section, rawval, reference) ++ ++ ++class InterpolationSyntaxError(InterpolationError): ++ """Raised when the source text contains invalid syntax. ++ ++ Current implementation raises this exception when the source text into ++ which substitutions are made does not conform to the required syntax. ++ """ ++ ++ ++class InterpolationDepthError(InterpolationError): ++ """Raised when substitutions are nested too deeply.""" ++ ++ def __init__(self, option, section, rawval): ++ msg = ( ++ "Recursion limit exceeded in value substitution: option {0!r} " ++ "in section {1!r} contains an interpolation key which " ++ "cannot be substituted in {2} steps. Raw value: {3!r}" ++ "".format(option, section, MAX_INTERPOLATION_DEPTH, rawval) ++ ) ++ InterpolationError.__init__(self, option, section, msg) ++ self.args = (option, section, rawval) ++ ++ ++class ParsingError(Error): ++ """Raised when a configuration file does not follow legal syntax.""" ++ ++ def __init__(self, source=None, filename=None): ++ # Exactly one of `source'/`filename' arguments has to be given. ++ # `filename' kept for compatibility. ++ if filename and source: ++ raise ValueError( ++ "Cannot specify both `filename' and `source'. " "Use `source'." ++ ) ++ elif not filename and not source: ++ raise ValueError("Required argument `source' not given.") ++ elif filename: ++ source = filename ++ Error.__init__(self, 'Source contains parsing errors: %r' % source) ++ self.source = source ++ self.errors = [] ++ self.args = (source,) ++ ++ @property ++ def filename(self): ++ """Deprecated, use `source'.""" ++ warnings.warn( ++ "The 'filename' attribute will be removed in future versions. " ++ "Use 'source' instead.", ++ DeprecationWarning, ++ stacklevel=2, ++ ) ++ return self.source ++ ++ @filename.setter ++ def filename(self, value): ++ """Deprecated, user `source'.""" ++ warnings.warn( ++ "The 'filename' attribute will be removed in future versions. " ++ "Use 'source' instead.", ++ DeprecationWarning, ++ stacklevel=2, ++ ) ++ self.source = value ++ ++ def append(self, lineno, line): ++ self.errors.append((lineno, line)) ++ self.message += '\n\t[line %2d]: %s' % (lineno, line) ++ ++ ++class MissingSectionHeaderError(ParsingError): ++ """Raised when a key-value pair is found before any section header.""" ++ ++ def __init__(self, filename, lineno, line): ++ Error.__init__( ++ self, ++ 'File contains no section headers.\nfile: %r, line: %d\n%r' ++ % (filename, lineno, line), ++ ) ++ self.source = filename ++ self.lineno = lineno ++ self.line = line ++ self.args = (filename, lineno, line) ++ ++ ++# Used in parser getters to indicate the default behaviour when a specific ++# option is not found it to raise an exception. Created to enable `None' as ++# a valid fallback value. ++_UNSET = object() ++ ++ ++class Interpolation(object): ++ """Dummy interpolation that passes the value through with no changes.""" ++ ++ def before_get(self, parser, section, option, value, defaults): ++ return value ++ ++ def before_set(self, parser, section, option, value): ++ return value ++ ++ def before_read(self, parser, section, option, value): ++ return value ++ ++ def before_write(self, parser, section, option, value): ++ return value ++ ++ ++class BasicInterpolation(Interpolation): ++ """Interpolation as implemented in the classic ConfigParser. ++ ++ The option values can contain format strings which refer to other values in ++ the same section, or values in the special default section. ++ ++ For example: ++ ++ something: %(dir)s/whatever ++ ++ would resolve the "%(dir)s" to the value of dir. All reference ++ expansions are done late, on demand. If a user needs to use a bare % in ++ a configuration file, she can escape it by writing %%. Other % usage ++ is considered a user error and raises `InterpolationSyntaxError'.""" ++ ++ _KEYCRE = re.compile(r"%\(([^)]+)\)s") ++ ++ def before_get(self, parser, section, option, value, defaults): ++ L = [] ++ self._interpolate_some(parser, option, L, value, section, defaults, 1) ++ return ''.join(L) ++ ++ def before_set(self, parser, section, option, value): ++ tmp_value = value.replace('%%', '') # escaped percent signs ++ tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax ++ if '%' in tmp_value: ++ raise ValueError( ++ "invalid interpolation syntax in %r at " ++ "position %d" % (value, tmp_value.find('%')) ++ ) ++ return value ++ ++ def _interpolate_some(self, parser, option, accum, rest, section, map, depth): ++ rawval = parser.get(section, option, raw=True, fallback=rest) ++ if depth > MAX_INTERPOLATION_DEPTH: ++ raise InterpolationDepthError(option, section, rawval) ++ while rest: ++ p = rest.find("%") ++ if p < 0: ++ accum.append(rest) ++ return ++ if p > 0: ++ accum.append(rest[:p]) ++ rest = rest[p:] ++ # p is no longer used ++ c = rest[1:2] ++ if c == "%": ++ accum.append("%") ++ rest = rest[2:] ++ elif c == "(": ++ m = self._KEYCRE.match(rest) ++ if m is None: ++ raise InterpolationSyntaxError( ++ option, ++ section, ++ "bad interpolation variable reference %r" % rest, ++ ) ++ var = parser.optionxform(m.group(1)) ++ rest = rest[m.end() :] ++ try: ++ v = map[var] ++ except KeyError: ++ raise from_none( ++ InterpolationMissingOptionError(option, section, rawval, var) ++ ) ++ if "%" in v: ++ self._interpolate_some( ++ parser, option, accum, v, section, map, depth + 1 ++ ) ++ else: ++ accum.append(v) ++ else: ++ raise InterpolationSyntaxError( ++ option, ++ section, ++ "'%%' must be followed by '%%' or '(', " "found: %r" % (rest,), ++ ) ++ ++ ++class ExtendedInterpolation(Interpolation): ++ """Advanced variant of interpolation, supports the syntax used by ++ `zc.buildout'. Enables interpolation between sections.""" ++ ++ _KEYCRE = re.compile(r"\$\{([^}]+)\}") ++ ++ def before_get(self, parser, section, option, value, defaults): ++ L = [] ++ self._interpolate_some(parser, option, L, value, section, defaults, 1) ++ return ''.join(L) ++ ++ def before_set(self, parser, section, option, value): ++ tmp_value = value.replace('$$', '') # escaped dollar signs ++ tmp_value = self._KEYCRE.sub('', tmp_value) # valid syntax ++ if '$' in tmp_value: ++ raise ValueError( ++ "invalid interpolation syntax in %r at " ++ "position %d" % (value, tmp_value.find('$')) ++ ) ++ return value ++ ++ def _interpolate_some(self, parser, option, accum, rest, section, map, depth): ++ rawval = parser.get(section, option, raw=True, fallback=rest) ++ if depth > MAX_INTERPOLATION_DEPTH: ++ raise InterpolationDepthError(option, section, rawval) ++ while rest: ++ p = rest.find("$") ++ if p < 0: ++ accum.append(rest) ++ return ++ if p > 0: ++ accum.append(rest[:p]) ++ rest = rest[p:] ++ # p is no longer used ++ c = rest[1:2] ++ if c == "$": ++ accum.append("$") ++ rest = rest[2:] ++ elif c == "{": ++ m = self._KEYCRE.match(rest) ++ if m is None: ++ raise InterpolationSyntaxError( ++ option, ++ section, ++ "bad interpolation variable reference %r" % rest, ++ ) ++ path = m.group(1).split(':') ++ rest = rest[m.end() :] ++ sect = section ++ opt = option ++ try: ++ if len(path) == 1: ++ opt = parser.optionxform(path[0]) ++ v = map[opt] ++ elif len(path) == 2: ++ sect = path[0] ++ opt = parser.optionxform(path[1]) ++ v = parser.get(sect, opt, raw=True) ++ else: ++ raise InterpolationSyntaxError( ++ option, section, "More than one ':' found: %r" % (rest,) ++ ) ++ except (KeyError, NoSectionError, NoOptionError): ++ raise from_none( ++ InterpolationMissingOptionError( ++ option, section, rawval, ":".join(path) ++ ) ++ ) ++ if "$" in v: ++ self._interpolate_some( ++ parser, ++ opt, ++ accum, ++ v, ++ sect, ++ dict(parser.items(sect, raw=True)), ++ depth + 1, ++ ) ++ else: ++ accum.append(v) ++ else: ++ raise InterpolationSyntaxError( ++ option, ++ section, ++ "'$' must be followed by '$' or '{', " "found: %r" % (rest,), ++ ) ++ ++ ++class LegacyInterpolation(Interpolation): ++ """Deprecated interpolation used in old versions of ConfigParser. ++ Use BasicInterpolation or ExtendedInterpolation instead.""" ++ ++ _KEYCRE = re.compile(r"%\(([^)]*)\)s|.") ++ ++ def before_get(self, parser, section, option, value, vars): ++ rawval = value ++ depth = MAX_INTERPOLATION_DEPTH ++ while depth: # Loop through this until it's done ++ depth -= 1 ++ if value and "%(" in value: ++ replace = functools.partial(self._interpolation_replace, parser=parser) ++ value = self._KEYCRE.sub(replace, value) ++ try: ++ value = value % vars ++ except KeyError as e: ++ raise from_none( ++ InterpolationMissingOptionError( ++ option, section, rawval, e.args[0] ++ ) ++ ) ++ else: ++ break ++ if value and "%(" in value: ++ raise InterpolationDepthError(option, section, rawval) ++ return value ++ ++ def before_set(self, parser, section, option, value): ++ return value ++ ++ @staticmethod ++ def _interpolation_replace(match, parser): ++ s = match.group(1) ++ if s is None: ++ return match.group() ++ else: ++ return "%%(%s)s" % parser.optionxform(s) ++ ++ ++class RawConfigParser(MutableMapping): ++ """ConfigParser that does not do interpolation.""" ++ ++ # Regular expressions for parsing section headers and options ++ _SECT_TMPL = r""" ++ \[ # [ ++ (?P
[^]]+) # very permissive! ++ \] # ] ++ """ ++ _OPT_TMPL = r""" ++ (?P