From 70d718c4f0d4ccd9a2b7f5369b2cc124b042c8e6 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Tue, 22 Jan 2019 09:52:04 -0800 Subject: [PATCH 1/2] Make tox -evendor idempotent. This affords adding a CI check to ensure we never commit vendored code with modifications beyond import re-writes. Fixes #649 Fixes #650 --- .travis.yml | 5 +++ pex/environment.py | 4 +-- pex/vendor/__main__.py | 36 +++++++++++++++++--- pex/vendor/_vendored/wheel/wheel/metadata.py | 2 +- tox.ini | 8 +++++ 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index e8a5490cd..1168db6cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -99,6 +99,11 @@ matrix: env: *x-py27 script: tox -ve isort-check + - <<: *x-linux-shard + name: TOXENV=vendor-check + env: *x-py27 + script: tox -ve vendor-check + - <<: *x-linux-shard name: TOXENV=py27 env: *x-py27 diff --git a/pex/environment.py b/pex/environment.py index e16125482..bde20e602 100644 --- a/pex/environment.py +++ b/pex/environment.py @@ -32,12 +32,12 @@ def _import_pkg_resources(): try: - import pkg_resources + import pkg_resources # vendor:skip return pkg_resources, False except ImportError: from pex import third_party third_party.install(expose=['setuptools']) - import pkg_resources + import pkg_resources # vendor:skip return pkg_resources, True diff --git a/pex/vendor/__main__.py b/pex/vendor/__main__.py index aff93b50c..d0fdac893 100644 --- a/pex/vendor/__main__.py +++ b/pex/vendor/__main__.py @@ -5,15 +5,17 @@ import os import pkgutil +import shutil import subprocess import sys +import tempfile from collections import OrderedDict from colors import bold, green, yellow -from redbaron import LiteralyEvaluable, NameNode, RedBaron +from redbaron import CommentNode, LiteralyEvaluable, NameNode, RedBaron from pex import third_party -from pex.common import safe_delete, safe_rmtree +from pex.common import safe_delete from pex.vendor import iter_vendor_specs @@ -32,6 +34,14 @@ def _parse(python_file): # losing formatting. See: https://github.com/PyCQA/redbaron return RedBaron(fp.read()) + @staticmethod + def _skip(node): + next_node = node.next_recursive + if isinstance(next_node, CommentNode) and next_node.value.strip() == '# vendor:skip': + print('Skipping {} as directed by {}'.format(node, next_node)) + return True + return False + @staticmethod def _find_literal_node(statement, call_argument): # The list of identifiers is large and they represent disjoint types: @@ -78,6 +88,9 @@ def rewrite(self, python_file): def _modify__import__calls(self, red_baron): # noqa: We want __import__ as part of the name. for call_node in red_baron.find_all('CallNode'): if call_node.previous and call_node.previous.value == '__import__': + if self._skip(call_node): + continue + parent = call_node.parent_find('AtomtrailersNode') original = parent.copy() first_argument = call_node[0] @@ -91,6 +104,9 @@ def _modify__import__calls(self, red_baron): # noqa: We want __import__ as part def _modify_import_statements(self, red_baron): for import_node in red_baron.find_all('ImportNode'): + if self._skip(import_node): + continue + original = import_node.copy() for index, import_module in enumerate(import_node): root_package = import_module[0] @@ -134,6 +150,9 @@ def prefixed_fullname(): def _modify_from_import_statements(self, red_baron): for from_import_node in red_baron.find_all('FromImportNode'): + if self._skip(from_import_node): + continue + if len(from_import_node) == 0: # NB: `from . import ...` has length 0, but we don't care about relative imports which will # point back into vendored code if the origin is within vendored code. @@ -153,15 +172,22 @@ class VendorizeError(Exception): def vendorize(root_dir, vendor_specs, prefix): for vendor_spec in vendor_specs: - cmd = ['pip', 'install', '--upgrade', '--no-compile', '--target', vendor_spec.target_dir, + script_dev_null = tempfile.mkdtemp() + cmd = ['pip', + 'install', + '--upgrade', + '--no-compile', + '--target', vendor_spec.target_dir, + '--install-option', '--install-scripts={}'.format(script_dev_null), vendor_spec.requirement] result = subprocess.call(cmd) + shutil.rmtree(script_dev_null) if result != 0: raise VendorizeError('Failed to vendor {!r}'.format(vendor_spec)) - # We know we can get these as a by-product of a pip install but never need them. - safe_rmtree(os.path.join(vendor_spec.target_dir, 'bin')) + # We know we can get this as a by-product of a pip install but never need it. safe_delete(os.path.join(vendor_spec.target_dir, 'easy_install.py')) + vendor_spec.create_packages() vendored_path = [vendor_spec.target_dir for vendor_spec in vendor_specs] diff --git a/pex/vendor/_vendored/wheel/wheel/metadata.py b/pex/vendor/_vendored/wheel/wheel/metadata.py index 7afdf7876..eca49bc09 100644 --- a/pex/vendor/_vendored/wheel/wheel/metadata.py +++ b/pex/vendor/_vendored/wheel/wheel/metadata.py @@ -13,7 +13,7 @@ # Wheel itself is probably the only program that uses non-extras markers # in METADATA/PKG-INFO. Support its syntax with the extra at the end only. -EXTRA_RE = re.compile(r"^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$") +EXTRA_RE = re.compile("""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") MayRequiresKey = namedtuple('MayRequiresKey', ('condition', 'extra')) diff --git a/tox.ini b/tox.ini index 9d71d7d86..bcc33cc9a 100644 --- a/tox.ini +++ b/tox.ini @@ -25,6 +25,7 @@ deps = whitelist_externals = open bash + git [testenv:integration-tests] deps = @@ -146,6 +147,13 @@ commands = python -m pex.vendor {[testenv:isort-run]commands} +[testenv:vendor-check] +deps = + tox +commands = + tox -e vendor + git diff --quiet + [testenv:docs] changedir = docs deps = From 7a72d65b72d31c762ae5346c667061b5e60d282a Mon Sep 17 00:00:00 2001 From: John Sirois Date: Tue, 22 Jan 2019 11:33:47 -0800 Subject: [PATCH 2/2] Trash the RECORD for robust idempotency. We now have the vendor-check / git as the stand-in for the RECORD, so this is ok. --- pex/vendor/__main__.py | 22 ++-- .../setuptools-40.6.2.dist-info/RECORD | 104 ------------------ .../wheel/wheel-0.31.1.dist-info/RECORD | 25 ----- 3 files changed, 10 insertions(+), 141 deletions(-) delete mode 100644 pex/vendor/_vendored/setuptools/setuptools-40.6.2.dist-info/RECORD delete mode 100644 pex/vendor/_vendored/wheel/wheel-0.31.1.dist-info/RECORD diff --git a/pex/vendor/__main__.py b/pex/vendor/__main__.py index d0fdac893..1bda990a4 100644 --- a/pex/vendor/__main__.py +++ b/pex/vendor/__main__.py @@ -5,17 +5,15 @@ import os import pkgutil -import shutil import subprocess import sys -import tempfile from collections import OrderedDict from colors import bold, green, yellow from redbaron import CommentNode, LiteralyEvaluable, NameNode, RedBaron from pex import third_party -from pex.common import safe_delete +from pex.common import safe_delete, safe_rmtree from pex.vendor import iter_vendor_specs @@ -172,22 +170,22 @@ class VendorizeError(Exception): def vendorize(root_dir, vendor_specs, prefix): for vendor_spec in vendor_specs: - script_dev_null = tempfile.mkdtemp() - cmd = ['pip', - 'install', - '--upgrade', - '--no-compile', - '--target', vendor_spec.target_dir, - '--install-option', '--install-scripts={}'.format(script_dev_null), + cmd = ['pip', 'install', '--upgrade', '--no-compile', '--target', vendor_spec.target_dir, vendor_spec.requirement] result = subprocess.call(cmd) - shutil.rmtree(script_dev_null) if result != 0: raise VendorizeError('Failed to vendor {!r}'.format(vendor_spec)) - # We know we can get this as a by-product of a pip install but never need it. + # We know we can get these as a by-product of a pip install but never need them. + safe_rmtree(os.path.join(vendor_spec.target_dir, 'bin')) safe_delete(os.path.join(vendor_spec.target_dir, 'easy_install.py')) + # The RECORD contains file hashes of all installed files and is unfortunately unstable in the + # case of scripts which get a shebang added with a system-specific path to the python + # interpreter to execute. + safe_delete(os.path.join(vendor_spec.target_dir, + '{}-{}.dist-info/RECORD'.format(vendor_spec.key, vendor_spec.version))) + vendor_spec.create_packages() vendored_path = [vendor_spec.target_dir for vendor_spec in vendor_specs] diff --git a/pex/vendor/_vendored/setuptools/setuptools-40.6.2.dist-info/RECORD b/pex/vendor/_vendored/setuptools/setuptools-40.6.2.dist-info/RECORD deleted file mode 100644 index 17115e83e..000000000 --- a/pex/vendor/_vendored/setuptools/setuptools-40.6.2.dist-info/RECORD +++ /dev/null @@ -1,104 +0,0 @@ -../../bin/easy_install,sha256=mobbxX5T6xsePQx0mKfGDqU5kldm8RUJwrr_8lFZEns,282 -../../bin/easy_install-2.7,sha256=mobbxX5T6xsePQx0mKfGDqU5kldm8RUJwrr_8lFZEns,282 -easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 -pkg_resources/__init__.py,sha256=d7w_yqCD39lZE0-qxhWXPYoc-pZc3G2mD7EU2xhRLpM,104720 -pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 -pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 -pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 -pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 -pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 -pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 -pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 -pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 -pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 -pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 -pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 -pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -pkg_resources/extern/__init__.py,sha256=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498 -pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558 -setuptools-40.6.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -setuptools-40.6.2.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 -setuptools-40.6.2.dist-info/METADATA,sha256=xD5qjTNmFccxhrkNSRwX2ksMINOFNLCysl5ESfOrYRE,3092 -setuptools-40.6.2.dist-info/RECORD,, -setuptools-40.6.2.dist-info/WHEEL,sha256=CihQvCnsGZQBGAHLEUMf0IdA4fRduS_NBUTMgCTtvPM,110 -setuptools-40.6.2.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 -setuptools-40.6.2.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 -setuptools-40.6.2.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 -setuptools-40.6.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -setuptools/__init__.py,sha256=ipsF2yFkfHmryPP8ASJEtOj9N9OuYkk8HxxIJyOHtj0,6001 -setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218 -setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 -setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 -setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 -setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 -setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 -setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 -setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 -setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 -setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 -setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 -setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 -setuptools/build_meta.py,sha256=qg4RfvgZF1uZPuO1VMioG8JRhNMp5fHrwgpgkYpnzc8,6021 -setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 -setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594 -setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 -setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167 -setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 -setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 -setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 -setuptools/command/build_ext.py,sha256=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897 -setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 -setuptools/command/develop.py,sha256=Sl1iMOORbAnp5BqiXmyMBD0uuvEnhSfOCqbxIPRiJPc,8060 -setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 -setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273 -setuptools/command/egg_info.py,sha256=3lsuTHQFjmAw6slzRrB3HjLiF2TaImpWHREllAPhyv8,25541 -setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 -setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 -setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 -setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 -setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 -setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 -setuptools/command/register.py,sha256=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534 -setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 -setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 -setuptools/command/sdist.py,sha256=obDTe2BmWt2PlnFPZZh7e0LWvemEsbCCO9MzhrTZjm8,6711 -setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 -setuptools/command/test.py,sha256=fSl5OsZWSmFR3QJRvyy2OxbcYkuIkPvykWNOhFvAcUA,9228 -setuptools/command/upload.py,sha256=BpQCjKtJZ4kEb0qIOiTjlJtbpapmNacC27nG2ZlSxTY,6825 -setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 -setuptools/config.py,sha256=nCkzIQRWTpVwvtSlFm1kOeSLMMHXmB7hENxwZUT6X9Q,19751 -setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 -setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 -setuptools/dist.py,sha256=HyRYLlPp_gkcnvQf8o1RsGq99LtghAeAfxWxbf40KxA,44675 -setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 -setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499 -setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 -setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084 -setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 -setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 -setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 -setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 -setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 -setuptools/monkey.py,sha256=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264 -setuptools/msvc.py,sha256=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838 -setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 -setuptools/package_index.py,sha256=yeifZQhJVRwPSaQmRrVPxbXRy-1lF5KdTFV8NAb3YcE,40342 -setuptools/pep425tags.py,sha256=bSGwlybcIpssx9kAv_hqAUJzfEpXSzYRp2u-nDYPdbk,10862 -setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 -setuptools/py31compat.py,sha256=REvrUBibUHgqI9S-ww0C9bhU-n8PyaQ8Slr1_NRxaaE,820 -setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195 -setuptools/py36compat.py,sha256=VUDWxmu5rt4QHlGTRtAFu6W5jvfL6WBjeDAzeoBy0OM,2891 -setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 -setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218 -setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 -setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302 -setuptools/ssl_support.py,sha256=YBDJsCZjSp62CWjxmSkke9kn9rhHHj25Cus6zhJRW3c,8492 -setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 -setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 -setuptools/wheel.py,sha256=A8hKSqHWZ5KM0-VP_DtptxpMxVF9pQwjWZcHGklxq2o,8102 -setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 diff --git a/pex/vendor/_vendored/wheel/wheel-0.31.1.dist-info/RECORD b/pex/vendor/_vendored/wheel/wheel-0.31.1.dist-info/RECORD deleted file mode 100644 index aabdff644..000000000 --- a/pex/vendor/_vendored/wheel/wheel-0.31.1.dist-info/RECORD +++ /dev/null @@ -1,25 +0,0 @@ -../../bin/wheel,sha256=BYhQx43PSyTylNcJi8tta9XfXy9nRwIceAWGtGi0qgY,261 -wheel-0.31.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -wheel-0.31.1.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 -wheel-0.31.1.dist-info/METADATA,sha256=tYscYj_1jH3_C-SNImnqtd_XCUp79Yo5SBRZYcl9qR8,12676 -wheel-0.31.1.dist-info/RECORD,, -wheel-0.31.1.dist-info/WHEEL,sha256=gduuPyBvFJQSQ0zdyxF7k0zynDXbIbvg5ZBHoXum5uk,110 -wheel-0.31.1.dist-info/entry_points.txt,sha256=pTyeGVsucyfr_BXe5OQKuA1Bp5YKaIAWy5pejkq4Qx0,109 -wheel-0.31.1.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 -wheel/__init__.py,sha256=EJBbDrY1g5CaE8xmai7elVg3eKNOnD6TxhfFTdxLNDY,96 -wheel/__main__.py,sha256=K--m7mq-27NO0fm-a8KlthkucCe0w_-0hVxL3uDujkU,419 -wheel/archive.py,sha256=RbdcLcuNYMiku7N1VbM7A3qbkSb6RkodHaoqY9CRVjs,2426 -wheel/bdist_wheel.py,sha256=PB76eFyXFx-5eHhsPj1DODAmW7b6rNM0rmS44PSY9VI,15904 -wheel/egg2wheel.py,sha256=yY5j8r3YbSAxT-bf7xKkktRAQmEuatH_H_r66Tvb_uk,3087 -wheel/install.py,sha256=19vooBHSrL8v7V8npfBdhEtddSvE4B-tcdZVJbs67W0,18989 -wheel/metadata.py,sha256=729-wUZkyMhbwz2PUPC3pEXRis1EfVWEFBiS3qBJEYU,4454 -wheel/paths.py,sha256=OAtaJgCivlKvJKw1qC3YbJypvp2d38Eka8GQWdBWNZw,1129 -wheel/pep425tags.py,sha256=Lk9zYm1rrHG1X3RKlf9plcwpsoSZT8UR7fG3jhaoZrQ,5760 -wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 -wheel/signatures/__init__.py,sha256=O7kZICZvXxN5YRkCYrPmAEr1LpGaZKJh5sLPWIRIoYE,3766 -wheel/signatures/djbec.py,sha256=C_tRkVy1oI4_lupYIF18xQDsv4kjs9x9fwP1O1yoOZc,7068 -wheel/signatures/ed25519py.py,sha256=nFKDMq4LW2iJKk4IZKMxY46GyZNYPKxuWha9xYHk9lE,1669 -wheel/signatures/keys.py,sha256=k4j4yGZL31Dt2pa5TneIEeq6qkVIXEPExmFxiZxpE1Y,3299 -wheel/tool/__init__.py,sha256=a_seWF51T_3mtbiOjinbqxbVsf4HjhP-BQw7PVahFjU,13587 -wheel/util.py,sha256=ewwxdLSStBtYYW6k-VxSjq9MZtfU7SaSAiknplRi-wk,4140 -wheel/wininst2wheel.py,sha256=PRniuPqQ70Mi-fc7NAh_jgkHk3p-qBHvpcanPqvBxk0,7791