pex 2.65.0__py2.py3-none-any.whl → 2.66.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pex might be problematic. Click here for more details.

Files changed (42) hide show
  1. pex/docs/html/_pagefind/fragment/en_1caf19d.pf_fragment +0 -0
  2. pex/docs/html/_pagefind/fragment/en_2268ed8.pf_fragment +0 -0
  3. pex/docs/html/_pagefind/fragment/{en_eb89be5.pf_fragment → en_469c87d.pf_fragment} +0 -0
  4. pex/docs/html/_pagefind/fragment/en_4a75d8d.pf_fragment +0 -0
  5. pex/docs/html/_pagefind/fragment/en_9fe4bcc.pf_fragment +0 -0
  6. pex/docs/html/_pagefind/fragment/{en_d450b85.pf_fragment → en_a951443.pf_fragment} +0 -0
  7. pex/docs/html/_pagefind/fragment/en_af1fb65.pf_fragment +0 -0
  8. pex/docs/html/_pagefind/fragment/en_e0b014e.pf_fragment +0 -0
  9. pex/docs/html/_pagefind/index/{en_71e2485.pf_index → en_f48c2e4.pf_index} +0 -0
  10. pex/docs/html/_pagefind/pagefind-entry.json +1 -1
  11. pex/docs/html/_pagefind/pagefind.en_4eb6e6f279.pf_meta +0 -0
  12. pex/docs/html/_static/documentation_options.js +1 -1
  13. pex/docs/html/api/vars.html +5 -5
  14. pex/docs/html/buildingpex.html +5 -5
  15. pex/docs/html/genindex.html +5 -5
  16. pex/docs/html/index.html +5 -5
  17. pex/docs/html/recipes.html +5 -5
  18. pex/docs/html/scie.html +5 -5
  19. pex/docs/html/search.html +5 -5
  20. pex/docs/html/whatispex.html +5 -5
  21. pex/hashing.py +71 -9
  22. pex/pex_builder.py +1 -4
  23. pex/pip/tool.py +3 -3
  24. pex/pip/vcs.py +93 -44
  25. pex/pip/version.py +7 -0
  26. pex/resolve/lock_downloader.py +1 -0
  27. pex/resolve/locker.py +13 -2
  28. pex/version.py +1 -1
  29. {pex-2.65.0.dist-info → pex-2.66.0.dist-info}/METADATA +4 -4
  30. {pex-2.65.0.dist-info → pex-2.66.0.dist-info}/RECORD +35 -35
  31. pex/docs/html/_pagefind/fragment/en_111cec6.pf_fragment +0 -0
  32. pex/docs/html/_pagefind/fragment/en_57535ac.pf_fragment +0 -0
  33. pex/docs/html/_pagefind/fragment/en_68579f8.pf_fragment +0 -0
  34. pex/docs/html/_pagefind/fragment/en_b915203.pf_fragment +0 -0
  35. pex/docs/html/_pagefind/fragment/en_ff882aa.pf_fragment +0 -0
  36. pex/docs/html/_pagefind/fragment/en_ffc2e0e.pf_fragment +0 -0
  37. pex/docs/html/_pagefind/pagefind.en_f11d4148c9.pf_meta +0 -0
  38. {pex-2.65.0.dist-info → pex-2.66.0.dist-info}/WHEEL +0 -0
  39. {pex-2.65.0.dist-info → pex-2.66.0.dist-info}/entry_points.txt +0 -0
  40. {pex-2.65.0.dist-info → pex-2.66.0.dist-info}/licenses/LICENSE +0 -0
  41. {pex-2.65.0.dist-info → pex-2.66.0.dist-info}/pylock/pylock.toml +0 -0
  42. {pex-2.65.0.dist-info → pex-2.66.0.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- {"version":"1.3.0","languages":{"en":{"hash":"en_f11d4148c9","wasm":"en","page_count":8}}}
1
+ {"version":"1.3.0","languages":{"en":{"hash":"en_4eb6e6f279","wasm":"en","page_count":8}}}
@@ -1,5 +1,5 @@
1
1
  const DOCUMENTATION_OPTIONS = {
2
- VERSION: '2.65.0',
2
+ VERSION: '2.66.0',
3
3
  LANGUAGE: 'en',
4
4
  COLLAPSE_INDEX: false,
5
5
  BUILDER: 'html',
@@ -8,7 +8,7 @@
8
8
  <link rel="prefetch" href="../_static/pex-logo-dark.png" as="image">
9
9
 
10
10
  <link rel="shortcut icon" href="../_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
11
- <title>PEX runtime environment variables - Pex Docs (v2.65.0)</title>
11
+ <title>PEX runtime environment variables - Pex Docs (v2.66.0)</title>
12
12
  <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d111a655" />
13
13
  <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=580074bf" />
14
14
  <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=8dab3a3b" />
@@ -163,7 +163,7 @@
163
163
  </label>
164
164
  </div>
165
165
  <div class="header-center">
166
- <a href="../index.html"><div class="brand">Pex Docs (v2.65.0)</div></a>
166
+ <a href="../index.html"><div class="brand">Pex Docs (v2.66.0)</div></a>
167
167
  </div>
168
168
  <div class="header-right">
169
169
  <div class="theme-toggle-container theme-toggle-header">
@@ -643,12 +643,12 @@
643
643
  </div>
644
644
  <div class="right-details">
645
645
  <div class="icons">
646
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
646
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
647
647
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
648
648
  </path>
649
649
  </svg>
650
650
  </a>
651
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
651
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
652
652
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
653
653
  </path>
654
654
  </svg>
@@ -671,7 +671,7 @@
671
671
 
672
672
  </aside>
673
673
  </div>
674
- </div><script src="../_static/documentation_options.js?v=7631db0c"></script>
674
+ </div><script src="../_static/documentation_options.js?v=e44e05e7"></script>
675
675
  <script src="../_static/doctools.js?v=9bcbadda"></script>
676
676
  <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
677
677
  <script src="../_static/scripts/furo.js?v=46bd48cc"></script>
@@ -8,7 +8,7 @@
8
8
  <link rel="prefetch" href="_static/pex-logo-dark.png" as="image">
9
9
 
10
10
  <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
11
- <title>Building .pex files - Pex Docs (v2.65.0)</title>
11
+ <title>Building .pex files - Pex Docs (v2.66.0)</title>
12
12
  <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
13
13
  <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
14
14
  <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
@@ -163,7 +163,7 @@
163
163
  </label>
164
164
  </div>
165
165
  <div class="header-center">
166
- <a href="index.html"><div class="brand">Pex Docs (v2.65.0)</div></a>
166
+ <a href="index.html"><div class="brand">Pex Docs (v2.66.0)</div></a>
167
167
  </div>
168
168
  <div class="header-right">
169
169
  <div class="theme-toggle-container theme-toggle-header">
@@ -681,12 +681,12 @@ scary like <code class="docutils literal notranslate"><span class="pre">sudo</sp
681
681
  </div>
682
682
  <div class="right-details">
683
683
  <div class="icons">
684
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
684
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
685
685
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
686
686
  </path>
687
687
  </svg>
688
688
  </a>
689
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
689
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
690
690
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
691
691
  </path>
692
692
  </svg>
@@ -709,7 +709,7 @@ scary like <code class="docutils literal notranslate"><span class="pre">sudo</sp
709
709
 
710
710
  </aside>
711
711
  </div>
712
- </div><script src="_static/documentation_options.js?v=7631db0c"></script>
712
+ </div><script src="_static/documentation_options.js?v=e44e05e7"></script>
713
713
  <script src="_static/doctools.js?v=9bcbadda"></script>
714
714
  <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
715
715
  <script src="_static/scripts/furo.js?v=46bd48cc"></script>
@@ -6,7 +6,7 @@
6
6
  <link rel="prefetch" href="_static/pex-logo-light.png" as="image">
7
7
  <link rel="prefetch" href="_static/pex-logo-dark.png" as="image">
8
8
 
9
- <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 --><title>Index - Pex Docs (v2.65.0)</title>
9
+ <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 --><title>Index - Pex Docs (v2.66.0)</title>
10
10
  <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
11
11
  <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
12
12
  <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
@@ -161,7 +161,7 @@
161
161
  </label>
162
162
  </div>
163
163
  <div class="header-center">
164
- <a href="index.html"><div class="brand">Pex Docs (v2.65.0)</div></a>
164
+ <a href="index.html"><div class="brand">Pex Docs (v2.66.0)</div></a>
165
165
  </div>
166
166
  <div class="header-right">
167
167
  <div class="theme-toggle-container theme-toggle-header">
@@ -260,12 +260,12 @@
260
260
  </div>
261
261
  <div class="right-details">
262
262
  <div class="icons">
263
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
263
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
264
264
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
265
265
  </path>
266
266
  </svg>
267
267
  </a>
268
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
268
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
269
269
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
270
270
  </path>
271
271
  </svg>
@@ -288,7 +288,7 @@
288
288
 
289
289
  </aside>
290
290
  </div>
291
- </div><script src="_static/documentation_options.js?v=7631db0c"></script>
291
+ </div><script src="_static/documentation_options.js?v=e44e05e7"></script>
292
292
  <script src="_static/doctools.js?v=9bcbadda"></script>
293
293
  <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
294
294
  <script src="_static/scripts/furo.js?v=46bd48cc"></script>
pex/docs/html/index.html CHANGED
@@ -8,7 +8,7 @@
8
8
  <link rel="prefetch" href="_static/pex-logo-dark.png" as="image">
9
9
 
10
10
  <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
11
- <title>Pex Docs (v2.65.0)</title>
11
+ <title>Pex Docs (v2.66.0)</title>
12
12
  <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
13
13
  <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
14
14
  <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
@@ -163,7 +163,7 @@
163
163
  </label>
164
164
  </div>
165
165
  <div class="header-center">
166
- <a href="#"><div class="brand">Pex Docs (v2.65.0)</div></a>
166
+ <a href="#"><div class="brand">Pex Docs (v2.66.0)</div></a>
167
167
  </div>
168
168
  <div class="header-right">
169
169
  <div class="theme-toggle-container theme-toggle-header">
@@ -341,12 +341,12 @@ To go straight to building pex files, see <a class="reference internal" href="bu
341
341
  </div>
342
342
  <div class="right-details">
343
343
  <div class="icons">
344
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
344
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
345
345
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
346
346
  </path>
347
347
  </svg>
348
348
  </a>
349
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
349
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
350
350
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
351
351
  </path>
352
352
  </svg>
@@ -389,7 +389,7 @@ To go straight to building pex files, see <a class="reference internal" href="bu
389
389
 
390
390
  </aside>
391
391
  </div>
392
- </div><script src="_static/documentation_options.js?v=7631db0c"></script>
392
+ </div><script src="_static/documentation_options.js?v=e44e05e7"></script>
393
393
  <script src="_static/doctools.js?v=9bcbadda"></script>
394
394
  <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
395
395
  <script src="_static/scripts/furo.js?v=46bd48cc"></script>
@@ -8,7 +8,7 @@
8
8
  <link rel="prefetch" href="_static/pex-logo-dark.png" as="image">
9
9
 
10
10
  <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
11
- <title>PEX Recipes and Notes - Pex Docs (v2.65.0)</title>
11
+ <title>PEX Recipes and Notes - Pex Docs (v2.66.0)</title>
12
12
  <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
13
13
  <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
14
14
  <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
@@ -163,7 +163,7 @@
163
163
  </label>
164
164
  </div>
165
165
  <div class="header-center">
166
- <a href="index.html"><div class="brand">Pex Docs (v2.65.0)</div></a>
166
+ <a href="index.html"><div class="brand">Pex Docs (v2.66.0)</div></a>
167
167
  </div>
168
168
  <div class="header-right">
169
169
  <div class="theme-toggle-container theme-toggle-header">
@@ -430,12 +430,12 @@ $<span class="w"> </span><span class="nb">export</span><span class="w"> </span><
430
430
  </div>
431
431
  <div class="right-details">
432
432
  <div class="icons">
433
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
433
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
434
434
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
435
435
  </path>
436
436
  </svg>
437
437
  </a>
438
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
438
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
439
439
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
440
440
  </path>
441
441
  </svg>
@@ -482,7 +482,7 @@ $<span class="w"> </span><span class="nb">export</span><span class="w"> </span><
482
482
 
483
483
  </aside>
484
484
  </div>
485
- </div><script src="_static/documentation_options.js?v=7631db0c"></script>
485
+ </div><script src="_static/documentation_options.js?v=e44e05e7"></script>
486
486
  <script src="_static/doctools.js?v=9bcbadda"></script>
487
487
  <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
488
488
  <script src="_static/scripts/furo.js?v=46bd48cc"></script>
pex/docs/html/scie.html CHANGED
@@ -8,7 +8,7 @@
8
8
  <link rel="prefetch" href="_static/pex-logo-dark.png" as="image">
9
9
 
10
10
  <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
11
- <title>PEX with included Python interpreter - Pex Docs (v2.65.0)</title>
11
+ <title>PEX with included Python interpreter - Pex Docs (v2.66.0)</title>
12
12
  <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
13
13
  <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
14
14
  <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
@@ -163,7 +163,7 @@
163
163
  </label>
164
164
  </div>
165
165
  <div class="header-center">
166
- <a href="index.html"><div class="brand">Pex Docs (v2.65.0)</div></a>
166
+ <a href="index.html"><div class="brand">Pex Docs (v2.66.0)</div></a>
167
167
  </div>
168
168
  <div class="header-right">
169
169
  <div class="theme-toggle-container theme-toggle-header">
@@ -623,12 +623,12 @@ uuid
623
623
  </div>
624
624
  <div class="right-details">
625
625
  <div class="icons">
626
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
626
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
627
627
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
628
628
  </path>
629
629
  </svg>
630
630
  </a>
631
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
631
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
632
632
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
633
633
  </path>
634
634
  </svg>
@@ -672,7 +672,7 @@ uuid
672
672
 
673
673
  </aside>
674
674
  </div>
675
- </div><script src="_static/documentation_options.js?v=7631db0c"></script>
675
+ </div><script src="_static/documentation_options.js?v=e44e05e7"></script>
676
676
  <script src="_static/doctools.js?v=9bcbadda"></script>
677
677
  <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
678
678
  <script src="_static/scripts/furo.js?v=46bd48cc"></script>
pex/docs/html/search.html CHANGED
@@ -6,7 +6,7 @@
6
6
  <link rel="prefetch" href="_static/pex-logo-light.png" as="image">
7
7
  <link rel="prefetch" href="_static/pex-logo-dark.png" as="image">
8
8
 
9
- <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 --><title>Search - Pex Docs (v2.65.0)</title><link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
9
+ <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 --><title>Search - Pex Docs (v2.66.0)</title><link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
10
10
  <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
11
11
  <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
12
12
 
@@ -176,7 +176,7 @@
176
176
  </label>
177
177
  </div>
178
178
  <div class="header-center">
179
- <a href="index.html"><div class="brand">Pex Docs (v2.65.0)</div></a>
179
+ <a href="index.html"><div class="brand">Pex Docs (v2.66.0)</div></a>
180
180
  </div>
181
181
  <div class="header-right">
182
182
  <div class="theme-toggle-container theme-toggle-header">
@@ -273,12 +273,12 @@
273
273
  </div>
274
274
  <div class="right-details">
275
275
  <div class="icons">
276
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
276
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
277
277
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
278
278
  </path>
279
279
  </svg>
280
280
  </a>
281
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
281
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
282
282
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
283
283
  </path>
284
284
  </svg>
@@ -301,7 +301,7 @@
301
301
 
302
302
  </aside>
303
303
  </div>
304
- </div><script src="_static/documentation_options.js?v=7631db0c"></script>
304
+ </div><script src="_static/documentation_options.js?v=e44e05e7"></script>
305
305
  <script src="_static/doctools.js?v=9bcbadda"></script>
306
306
  <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
307
307
  <script src="_static/scripts/furo.js?v=46bd48cc"></script>
@@ -8,7 +8,7 @@
8
8
  <link rel="prefetch" href="_static/pex-logo-dark.png" as="image">
9
9
 
10
10
  <link rel="shortcut icon" href="_static/pex-icon.png"><!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
11
- <title>What are .pex files? - Pex Docs (v2.65.0)</title>
11
+ <title>What are .pex files? - Pex Docs (v2.66.0)</title>
12
12
  <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=d111a655" />
13
13
  <link rel="stylesheet" type="text/css" href="_static/styles/furo.css?v=580074bf" />
14
14
  <link rel="stylesheet" type="text/css" href="_static/styles/furo-extensions.css?v=8dab3a3b" />
@@ -163,7 +163,7 @@
163
163
  </label>
164
164
  </div>
165
165
  <div class="header-center">
166
- <a href="index.html"><div class="brand">Pex Docs (v2.65.0)</div></a>
166
+ <a href="index.html"><div class="brand">Pex Docs (v2.66.0)</div></a>
167
167
  </div>
168
168
  <div class="header-right">
169
169
  <div class="theme-toggle-container theme-toggle-header">
@@ -322,12 +322,12 @@ build executable .pex files. This is described more thoroughly in
322
322
  </div>
323
323
  <div class="right-details">
324
324
  <div class="icons">
325
- <a class="muted-link " href="https://pypi.org/project/pex/2.65.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
325
+ <a class="muted-link " href="https://pypi.org/project/pex/2.66.0/" aria-label="PyPI"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
326
326
  <path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z">
327
327
  </path>
328
328
  </svg>
329
329
  </a>
330
- <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.65.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
330
+ <a class="muted-link " href="https://github.com/pex-tool/pex/releases/download/v2.66.0/pex" aria-label="Download"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 640 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
331
331
  <path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-132.9 88.7L299.3 420.7c-6.2 6.2-16.4 6.2-22.6 0L171.3 315.3c-10.1-10.1-2.9-27.3 11.3-27.3H248V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16v112h65.4c14.2 0 21.4 17.2 11.3 27.3z">
332
332
  </path>
333
333
  </svg>
@@ -371,7 +371,7 @@ build executable .pex files. This is described more thoroughly in
371
371
 
372
372
  </aside>
373
373
  </div>
374
- </div><script src="_static/documentation_options.js?v=7631db0c"></script>
374
+ </div><script src="_static/documentation_options.js?v=e44e05e7"></script>
375
375
  <script src="_static/doctools.js?v=9bcbadda"></script>
376
376
  <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
377
377
  <script src="_static/scripts/furo.js?v=46bd48cc"></script>
pex/hashing.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # Copyright 2022 Pex project contributors.
2
2
  # Licensed under the Apache License, Version 2.0 (see LICENSE).
3
3
 
4
- from __future__ import absolute_import
4
+ from __future__ import absolute_import, print_function
5
5
 
6
6
  import hashlib
7
7
  import os
@@ -241,10 +241,12 @@ def dir_hash(
241
241
  def iter_files():
242
242
  # type: () -> Iterator[Text]
243
243
  for root, dirs, files in os.walk(top, followlinks=True):
244
- dirs[:] = [d for d in dirs if dir_filter(os.path.join(root, d))]
244
+ dirs[:] = [
245
+ d for d in dirs if dir_filter(os.path.relpath(os.path.join(root, d), top))
246
+ ]
245
247
  for f in files:
246
248
  path = os.path.join(root, f)
247
- if file_filter(path):
249
+ if file_filter(os.path.relpath(path, top)):
248
250
  yield path
249
251
 
250
252
  file_paths = sorted(iter_files())
@@ -278,16 +280,26 @@ def zip_hash(
278
280
  else zf.namelist()
279
281
  )
280
282
 
281
- dirs = frozenset(name.rstrip("/") for name in namelist if name.endswith("/"))
282
- accept_dirs = frozenset(d for d in dirs if dir_filter(os.path.basename(d)))
283
- reject_dirs = dirs - accept_dirs
284
-
283
+ dirs = set()
284
+ for name in namelist:
285
+ if name.endswith("/"):
286
+ dirname = name.rstrip("/")
287
+ else:
288
+ dirname = os.path.dirname(name)
289
+ while dirname:
290
+ dirs.add(dirname)
291
+ dirname = os.path.dirname(dirname)
292
+
293
+ accept_dirs = frozenset(
294
+ d for d in dirs if dir_filter(os.path.relpath(d, relpath) if relpath else d)
295
+ )
296
+ reject_dirs = tuple("{dir}/".format(dir=path) for path in (dirs - accept_dirs))
285
297
  accept_files = sorted(
286
298
  name
287
299
  for name in namelist
288
300
  if not name.endswith("/")
289
- and not any(name.startswith(reject_dir) for reject_dir in reject_dirs)
290
- and file_filter(os.path.basename(name))
301
+ and not name.startswith(reject_dirs)
302
+ and file_filter(os.path.relpath(name, relpath) if relpath else name)
291
303
  )
292
304
 
293
305
  hashed_names = (
@@ -297,3 +309,53 @@ def zip_hash(
297
309
 
298
310
  for filename in accept_files:
299
311
  update_hash(zf.open(filename, "r"), digest)
312
+
313
+
314
+ if __name__ == "__main__":
315
+ import sys
316
+ import zipfile
317
+ from argparse import ArgumentParser
318
+
319
+ from pex.common import is_pyc_dir, is_pyc_file
320
+
321
+ parser = ArgumentParser()
322
+ parser.add_argument(
323
+ "--exclude-dir",
324
+ dest="exclude_dirs",
325
+ action="append",
326
+ default=[],
327
+ )
328
+ parser.add_argument("--zip-relpath")
329
+ parser.add_argument("paths", nargs="+")
330
+
331
+ options = parser.parse_args()
332
+ exclude_dirs = frozenset(options.exclude_dirs)
333
+
334
+ for path in options.paths:
335
+ digest = Sha256()
336
+ if zipfile.is_zipfile(path):
337
+ zip_hash(
338
+ path,
339
+ digest=digest,
340
+ relpath=options.zip_relpath,
341
+ dir_filter=(
342
+ lambda dir_path: (
343
+ not is_pyc_dir(dir_path) and os.path.basename(dir_path) not in exclude_dirs
344
+ )
345
+ ),
346
+ file_filter=lambda f: not is_pyc_file(f),
347
+ )
348
+ elif os.path.isdir(path):
349
+ dir_hash(
350
+ path,
351
+ digest=digest,
352
+ dir_filter=(
353
+ lambda dir_path: (
354
+ not is_pyc_dir(dir_path) and os.path.basename(dir_path) not in exclude_dirs
355
+ )
356
+ ),
357
+ file_filter=lambda f: not is_pyc_file(f),
358
+ )
359
+ else:
360
+ print("Can only hash zip files or directories. Skipping file", path, file=sys.stderr)
361
+ print(path, digest.hexdigest(), file=sys.stdout)
pex/pex_builder.py CHANGED
@@ -470,10 +470,7 @@ class PEXBuilder(object):
470
470
  def _prepare_code(self):
471
471
  chroot_path = self._chroot.path()
472
472
  self._pex_info.code_hash = CacheHelper.pex_code_hash(
473
- chroot_path,
474
- exclude_dirs=tuple(
475
- os.path.join(chroot_path, d) for d in (layout.BOOTSTRAP_DIR, layout.DEPS_DIR)
476
- ),
473
+ chroot_path, exclude_dirs=(layout.BOOTSTRAP_DIR, layout.DEPS_DIR)
477
474
  )
478
475
  self._pex_info.pex_hash = hashlib.sha1(self._pex_info.dump().encode("utf-8")).hexdigest()
479
476
  self._chroot.write(self._pex_info.dump().encode("utf-8"), PexInfo.PATH, label="manifest")
pex/pip/tool.py CHANGED
@@ -552,8 +552,7 @@ class Pip(object):
552
552
  )
553
553
  return Job(command=command, process=process, finalizer=finalizer, context="pip")
554
554
 
555
- @staticmethod
556
- def _iter_build_configuration_options(build_configuration):
555
+ def _iter_build_configuration_options(self, build_configuration):
557
556
  # type: (BuildConfiguration) -> Iterator[str]
558
557
 
559
558
  # N.B.: BuildConfiguration maintains invariants that ensure --only-binary, --no-binary,
@@ -576,7 +575,8 @@ class Pip(object):
576
575
  if build_configuration.prefer_older_binary:
577
576
  yield "--prefer-binary"
578
577
 
579
- if build_configuration.use_pep517 is not None:
578
+ # N.B.: In 25.3 `--use-pep517` became the default and only option.
579
+ if build_configuration.use_pep517 is not None and self.version < PipVersion.v25_3:
580
580
  yield "--use-pep517" if build_configuration.use_pep517 else "--no-use-pep517"
581
581
 
582
582
  if not build_configuration.build_isolation:
pex/pip/vcs.py CHANGED
@@ -3,26 +3,42 @@
3
3
 
4
4
  from __future__ import absolute_import
5
5
 
6
- import glob
7
6
  import os
8
7
  import re
9
8
 
10
9
  from pex import hashing
11
10
  from pex.artifact_url import VCS, Fingerprint
12
- from pex.common import is_pyc_dir, is_pyc_file, open_zip, temporary_dir
11
+ from pex.common import is_pyc_dir, is_pyc_file
12
+ from pex.exceptions import reportable_unexpected_error_msg
13
13
  from pex.hashing import Sha256
14
14
  from pex.pep_440 import Version
15
15
  from pex.pep_503 import ProjectName
16
16
  from pex.result import Error, try_
17
- from pex.tracer import TRACER
18
17
  from pex.typing import TYPE_CHECKING
19
18
 
20
19
  if TYPE_CHECKING:
21
- from typing import Optional, Tuple, Union
20
+ # N.B.: The `re.Pattern` type is not available in all Python versions Pex supports.
21
+ from re import Pattern # type: ignore[attr-defined]
22
+ from typing import Callable, Optional, Text, Tuple, Union
22
23
 
23
24
  from pex.hashing import HintedDigest
24
25
 
25
26
 
27
+ def _project_name_re(project_name):
28
+ # type: (ProjectName) -> str
29
+ return project_name.normalized.replace("-", "[-_.]+")
30
+
31
+
32
+ def _built_source_dist_pattern(project_name):
33
+ # type: (ProjectName) -> Pattern
34
+ return re.compile(
35
+ r"(?P<project_name>{project_name_re})-(?P<version>.+)\.zip".format(
36
+ project_name_re=_project_name_re(project_name)
37
+ ),
38
+ re.IGNORECASE,
39
+ )
40
+
41
+
26
42
  def _find_built_source_dist(
27
43
  build_dir, # type: str
28
44
  project_name, # type: ProjectName
@@ -34,12 +50,7 @@ def _find_built_source_dist(
34
50
  # encoded in: `pip._internal.req.req_install.InstallRequirement.archive`.
35
51
 
36
52
  listing = os.listdir(build_dir)
37
- pattern = re.compile(
38
- r"{project_name}-(?P<version>.+)\.zip".format(
39
- project_name=project_name.normalized.replace("-", "[-_.]+")
40
- ),
41
- re.IGNORECASE,
42
- )
53
+ pattern = _built_source_dist_pattern(project_name)
43
54
  for name in listing:
44
55
  match = pattern.match(name)
45
56
  if match and Version(match.group("version")) == version:
@@ -58,23 +69,66 @@ def _find_built_source_dist(
58
69
 
59
70
  def fingerprint_downloaded_vcs_archive(
60
71
  download_dir, # type: str
61
- project_name, # type: str
62
- version, # type: str
72
+ project_name, # type: ProjectName
73
+ version, # type: Version
63
74
  vcs, # type: VCS.Value
64
75
  ):
65
76
  # type: (...) -> Tuple[Fingerprint, str]
66
77
 
67
78
  archive_path = try_(
68
- _find_built_source_dist(
69
- build_dir=download_dir, project_name=ProjectName(project_name), version=Version(version)
70
- )
79
+ _find_built_source_dist(build_dir=download_dir, project_name=project_name, version=version)
71
80
  )
72
81
  digest = Sha256()
73
- digest_vcs_archive(archive_path=archive_path, vcs=vcs, digest=digest)
82
+ digest_vcs_archive(project_name=project_name, archive_path=archive_path, vcs=vcs, digest=digest)
74
83
  return Fingerprint.from_digest(digest), archive_path
75
84
 
76
85
 
86
+ def _vcs_dir_filter(
87
+ vcs, # type: VCS.Value
88
+ project_name, # type: ProjectName
89
+ ):
90
+ # type: (...) -> Callable[[Text], bool]
91
+
92
+ # Ignore VCS control directories for the purposes of fingerprinting the version controlled
93
+ # source tree. VCS control directories can contain non-reproducible content (Git at least
94
+ # has files that contain timestamps).
95
+ #
96
+ # We cannot prune these directories from the source archive directly unfortunately since
97
+ # some build processes use VCS version information to derive their version numbers (C.F.:
98
+ # https://pypi.org/project/setuptools-scm/). As such, we'll get a stable fingerprint, but be
99
+ # forced to re-build a wheel each time the VCS requirement is re-locked later, even when it
100
+ # hashes the same.
101
+ vcs_control_dir = ".{vcs}".format(vcs=vcs)
102
+
103
+ # N.B.: If the VCS project uses setuptools as its build backend, depending on the version of
104
+ # Pip used, the VCS checkout can have a `<project name>.egg-info/` directory littering its root
105
+ # left over from Pip generating project metadata to determine version and dependencies. No other
106
+ # well known build-backend has this problem at this time (checked hatchling, poetry-core,
107
+ # pdm-backend and uv_build).
108
+ # C.F.: https://github.com/pypa/pip/pull/13602
109
+ egg_info_dir_re = re.compile(
110
+ r"^{project_name_re}\.egg-info$".format(project_name_re=_project_name_re(project_name)),
111
+ re.IGNORECASE,
112
+ )
113
+
114
+ def vcs_dir_filter(dir_path):
115
+ # type: (Text) -> bool
116
+ if is_pyc_dir(dir_path):
117
+ return False
118
+
119
+ base_dir_name = dir_path.split(os.sep)[0]
120
+ return base_dir_name != vcs_control_dir and not egg_info_dir_re.match(base_dir_name)
121
+
122
+ return vcs_dir_filter
123
+
124
+
125
+ def _vcs_file_filter(vcs):
126
+ # type: (VCS.Value) -> Callable[[Text], bool]
127
+ return lambda f: not is_pyc_file(f)
128
+
129
+
77
130
  def digest_vcs_archive(
131
+ project_name, # type: ProjectName
78
132
  archive_path, # type: str
79
133
  vcs, # type: VCS.Value
80
134
  digest, # type: HintedDigest
@@ -84,22 +138,32 @@ def digest_vcs_archive(
84
138
  # All VCS requirements are prepared as zip archives as encoded in:
85
139
  # `pip._internal.req.req_install.InstallRequirement.archive` and the archive is already offset
86
140
  # by a subdirectory (if any).
87
- with TRACER.timed(
88
- "Digesting {archive} {vcs} archive".format(archive=os.path.basename(archive_path), vcs=vcs)
89
- ), temporary_dir() as chroot, open_zip(archive_path) as archive:
90
- # TODO(John Sirois): Consider implementing zip_hash to avoid the extractall.
91
- archive.extractall(chroot)
92
141
 
93
- # The zip archives created by Pip have a single project name top-level directory housing
94
- # the full clone. We look for that to get a consistent clone hash with a bare clone.
95
- listing = glob.glob(os.path.join(chroot, "*"))
96
- if len(listing) == 1 and os.path.isdir(listing[0]):
97
- chroot = listing[0]
142
+ # The zip archives created by Pip have a single project name top-level directory housing
143
+ # the full clone. We look for that to get a consistent clone hash with a bare clone.
144
+ match = _built_source_dist_pattern(project_name).match(os.path.basename(archive_path))
145
+ if match is None:
146
+ raise AssertionError(
147
+ reportable_unexpected_error_msg(
148
+ "Failed to determine the project name prefix for the VCS zip {zip} with expected "
149
+ "canonical project name {project_name}".format(
150
+ zip=archive_path, project_name=project_name
151
+ )
152
+ )
153
+ )
154
+ top_dir = match.group("project_name")
98
155
 
99
- digest_vcs_repo(repo_path=chroot, vcs=vcs, digest=digest)
156
+ hashing.zip_hash(
157
+ zip_path=archive_path,
158
+ digest=digest,
159
+ relpath=top_dir,
160
+ dir_filter=_vcs_dir_filter(vcs, project_name),
161
+ file_filter=_vcs_file_filter(vcs),
162
+ )
100
163
 
101
164
 
102
165
  def digest_vcs_repo(
166
+ project_name, # type: ProjectName
103
167
  repo_path, # type: str
104
168
  vcs, # type: VCS.Value
105
169
  digest, # type: HintedDigest
@@ -107,24 +171,9 @@ def digest_vcs_repo(
107
171
  ):
108
172
  # type: (...) -> None
109
173
 
110
- # Ignore VCS control directories for the purposes of fingerprinting the version controlled
111
- # source tree. VCS control directories can contain non-reproducible content (Git at least
112
- # has files that contain timestamps).
113
- #
114
- # We cannot prune these directories from the source archive directly unfortunately since
115
- # some build processes use VCS version information to derive their version numbers (C.F.:
116
- # https://pypi.org/project/setuptools-scm/). As such, we'll get a stable fingerprint, but be
117
- # forced to re-build a wheel each time the VCS requirement is re-locked later, even when it
118
- # hashes the same.
119
- vcs_control_dir = ".{vcs}".format(vcs=vcs)
120
-
121
174
  hashing.dir_hash(
122
175
  directory=os.path.join(repo_path, subdirectory) if subdirectory else repo_path,
123
176
  digest=digest,
124
- dir_filter=(
125
- lambda dir_path: (
126
- not is_pyc_dir(dir_path) and os.path.basename(dir_path) != vcs_control_dir
127
- )
128
- ),
129
- file_filter=lambda f: not is_pyc_file(f),
177
+ dir_filter=_vcs_dir_filter(vcs, project_name),
178
+ file_filter=_vcs_file_filter(vcs),
130
179
  )
pex/pip/version.py CHANGED
@@ -369,6 +369,13 @@ class PipVersion(Enum["PipVersionValue"]):
369
369
  requires_python=">=3.9,<3.16",
370
370
  )
371
371
 
372
+ v25_3 = PipVersionValue(
373
+ version="25.3",
374
+ setuptools_version="80.9.0",
375
+ wheel_version="0.45.1",
376
+ requires_python=">=3.9,<3.16",
377
+ )
378
+
372
379
  VENDORED = v20_3_4_patched
373
380
  LATEST = LatestPipVersion()
374
381
  LATEST_COMPATIBLE = LatestCompatiblePipVersion()
@@ -154,6 +154,7 @@ class VCSArtifactDownloadManager(DownloadManager[VCSArtifact]):
154
154
  local_distribution = downloaded_vcs.local_distributions[0]
155
155
  filename = os.path.basename(local_distribution.path)
156
156
  digest_vcs_archive(
157
+ project_name=project_name,
157
158
  archive_path=local_distribution.path,
158
159
  vcs=artifact.vcs,
159
160
  digest=digest,
pex/resolve/locker.py CHANGED
@@ -291,6 +291,16 @@ class Locker(LogAnalyzer):
291
291
  def _maybe_record_wheel(self, url):
292
292
  # type: (str) -> ArtifactURL
293
293
  artifact_url = self.parse_url_and_maybe_record_fingerprint(url)
294
+
295
+ # N.B.: Lock resolves driven by `pip install --dry-run --report` will only consult PEP-658
296
+ # `.whl.metadata` side-car files in the happy path; so we must use these as a proxy for the
297
+ # `.whl` file they are paired with.
298
+ # See: https://peps.python.org/pep-0658/
299
+ if not self._lock_is_via_pip_download and artifact_url.url_info.path.endswith(".metadata"):
300
+ artifact_url = ArtifactURL.from_url_info(
301
+ artifact_url.url_info._replace(path=artifact_url.url_info.path[:-9])
302
+ )
303
+
294
304
  if artifact_url.is_wheel:
295
305
  pin, partial_artifact = self._extract_resolve_data(artifact_url)
296
306
 
@@ -371,8 +381,8 @@ class Locker(LogAnalyzer):
371
381
  if isinstance(artifact_url.scheme, VCSScheme):
372
382
  source_fingerprint, archive_path = fingerprint_downloaded_vcs_archive(
373
383
  download_dir=self._download_dir,
374
- project_name=str(build_result.pin.project_name),
375
- version=str(build_result.pin.version),
384
+ project_name=build_result.pin.project_name,
385
+ version=build_result.pin.version,
376
386
  vcs=artifact_url.scheme.vcs,
377
387
  )
378
388
  verified = True
@@ -445,6 +455,7 @@ class Locker(LogAnalyzer):
445
455
  if isinstance(artifact_url.scheme, VCSScheme):
446
456
  digest = Sha256()
447
457
  digest_vcs_repo(
458
+ project_name=build_result.pin.project_name,
448
459
  repo_path=build_result.path,
449
460
  vcs=artifact_url.scheme.vcs,
450
461
  digest=digest,
pex/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright 2015 Pex project contributors.
2
2
  # Licensed under the Apache License, Version 2.0 (see LICENSE).
3
3
 
4
- __version__ = "2.65.0"
4
+ __version__ = "2.66.0"
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pex
3
- Version: 2.65.0
3
+ Version: 2.66.0
4
4
  Summary: The PEX packaging toolchain.
5
5
  Home-page: https://github.com/pex-tool/pex
6
- Download-URL: https://github.com/pex-tool/pex/releases/download/v2.65.0/pex
6
+ Download-URL: https://github.com/pex-tool/pex/releases/download/v2.66.0/pex
7
7
  Author: The PEX developers
8
8
  Author-email: developers@pex-tool.org
9
9
  License-Expression: Apache-2.0
10
- Project-URL: Changelog, https://github.com/pex-tool/pex/blob/v2.65.0/CHANGES.md
10
+ Project-URL: Changelog, https://github.com/pex-tool/pex/blob/v2.66.0/CHANGES.md
11
11
  Project-URL: Documentation, https://docs.pex-tool.org/
12
- Project-URL: Source, https://github.com/pex-tool/pex/tree/v2.65.0
12
+ Project-URL: Source, https://github.com/pex-tool/pex/tree/v2.66.0
13
13
  Keywords: package,executable,virtualenv,lock,freeze
14
14
  Classifier: Development Status :: 5 - Production/Stable
15
15
  Classifier: Intended Audience :: Developers
@@ -24,7 +24,7 @@ pex/fetcher.py,sha256=k6wIRU3aX478ExoNdRVd7miC_D-Ftw8s6WUHw50MKvY,14408
24
24
  pex/finders.py,sha256=hmsrBoKmejx1ABPeCHhAtFk0lXhGV3WYGjhrjFufTKY,5109
25
25
  pex/fingerprinted_distribution.py,sha256=0NB-Q-lOZV1QLfyrTDUN8KeezNgDGODFOLuolAAWJFM,752
26
26
  pex/globals.py,sha256=9LnuOG1hu4azLd_auaUw2g_zS5m1KumEds7hh9lmdis,231
27
- pex/hashing.py,sha256=ZFKHJva_XPYz3nYQkjKLob5-WprAHeA6WtAGwfwXkQk,8585
27
+ pex/hashing.py,sha256=BOXMbmU9Abbwzx2pMzyN2rP8muVe4HV8MeCbTLSEOiQ,10536
28
28
  pex/hashing.py.lck,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  pex/inherit_path.py,sha256=NyEC7OxIQp3lwtZJAU3DxEGtJHM9GcKDkaaUmqZrJTU,1004
30
30
  pex/installed_wheel.py,sha256=zPBq4AuXh4TsrtNU86bs1s3zc44YHckJp94y9oHZ_GE,5270
@@ -47,7 +47,7 @@ pex/pep_723.py,sha256=1mvpMxYRf6Sxte0aI_aAkStdYPSov0rF_NVCMjY1YJs,11740
47
47
  pex/pex.py,sha256=lBa8xgf77FbUzBRViannbtw8wnCajIOWOw9k961x6HE,33955
48
48
  pex/pex_boot.py,sha256=GKxNP3c9ntoBP7r78ms38RKhEugdOkVKWlIA8K9_bDk,8187
49
49
  pex/pex_bootstrapper.py,sha256=8a8Tk0JAcek-XeoejyZZwQUuT4FYrwrmVEYuoYBWAxY,32002
50
- pex/pex_builder.py,sha256=6PW1yhd7iON8lU0_IMXNAO-R6_6k1VW8ol2K_j6yI0Y,34153
50
+ pex/pex_builder.py,sha256=itEEY5BukJAvcTrxHM7oo3Fo8r_xmr7ehYLQp1RAVSw,34065
51
51
  pex/pex_info.py,sha256=YQjwZu1uPnCpCVO8oXHvKO-Aa_Rqz_NokelZR2tVe2A,22588
52
52
  pex/pex_root.py,sha256=wk5C_mmgRej_vHpSn1lDVehM5yEq3E6tY2s2ZkgoB1Y,2196
53
53
  pex/pex_warnings.py,sha256=lxPhCx_3mdUcrGBuH6f-K49mZ10IDrNOrpvpbC1NFTA,1113
@@ -69,7 +69,7 @@ pex/tracer.py,sha256=nob_hNooCYWZev7_ABhAVyO4HBZ8Q_OajQUvNnr82Rc,4481
69
69
  pex/typing.py,sha256=J1JTB1V48zIWmhWRHEMDHWMaFPMzsEonWJ9s57Ev43Q,3050
70
70
  pex/util.py,sha256=TxTxpdDmrDTLVXt9e2XuRq9c3N6jRYNCce87QBFkCVo,5491
71
71
  pex/variables.py,sha256=h3-JeMzXfRzEsWqTYsoU-6vt5W4Kr0VvbfSDAYtuZOU,34728
72
- pex/version.py,sha256=FUXhBrNm1TNmqwSSRKzZ8ZZnP5Rgn6IVDy7RlykOpd4,131
72
+ pex/version.py,sha256=JU9e5XKAuFUgDTFOC8wwIQkE3nkk3WfWepG33HUlCdE,131
73
73
  pex/wheel.py,sha256=R9jPWwzla_c3xUbeYjaQMrKC0ly8UexKMLfuRDhP054,11146
74
74
  pex/whl.py,sha256=0Nh1d6kmAaRANCygoVZZi0zii6j_elRQc7N6yDHTuMY,2513
75
75
  pex/ziputils.py,sha256=thUrto9vEdG9mFCIJ59Js3d1y6bSfFdl7pb1lSb7KAQ,9620
@@ -113,33 +113,33 @@ pex/distutils/commands/__init__.py,sha256=uASB5OU996Jax-h3kMmeZjG5Jdy9BYDR6A1swk
113
113
  pex/distutils/commands/bdist_pex.py,sha256=SLwBj0ALpArhKQT94X0niKWfyLaySjOZuZrGXG332K0,5117
114
114
  pex/docs/__init__.py,sha256=u9hPOij1fpo1yPBLTQTdSCnSIUuRCSXHomCkEAaCciA,439
115
115
  pex/docs/command.py,sha256=uQyD8bO_DBNIlkPd6F7SFZbZUVh1Xn6gT8OmVxP4qxk,3046
116
- pex/docs/html/buildingpex.html,sha256=MWHG4FwDarUd4ymrlPmYQofQKzj8VgeTFT9yimiWD5k,57407
117
- pex/docs/html/genindex.html,sha256=ZRPQ0j43FvxwPhgKgxtkYvgCJIrI7kgkwEIyv1XZWn0,17198
118
- pex/docs/html/index.html,sha256=wu97FkE5vP6iEkz_RVDyPM8NFzIigRFNTJHtMERRSYo,25028
119
- pex/docs/html/recipes.html,sha256=nKdUT6iYbCIlhntE4qyZPsB74QPsWbYW0tjvfwK2txE,35192
120
- pex/docs/html/scie.html,sha256=WUYE-ncRx-8qAXQfJ493fIphwjjG06ZuGje_HzBR3pk,62182
121
- pex/docs/html/search.html,sha256=HtixXlAQBVL3xzSoJlP5CRmhblBWyc_la3fiCXrXZNY,18169
116
+ pex/docs/html/buildingpex.html,sha256=ynKT2arr5JmjBoz9tpAG3DjP4DvC2Q1jaReHr7Lq8bs,57407
117
+ pex/docs/html/genindex.html,sha256=knmLTMNEboqxQ4ifvtYUfk6WMVYFAOQDoRucHxwaZCM,17198
118
+ pex/docs/html/index.html,sha256=DFrqPPomteY78CfoTAm0cUopDhP1uN4DAGi601ydlc8,25028
119
+ pex/docs/html/recipes.html,sha256=SsDMMEgltfwb-O3u0bA7F84G3RtAhf95_ffFsWAbJHc,35192
120
+ pex/docs/html/scie.html,sha256=qQaFpVJF1pta8e7kqruDIyarJL4u16rS0xfeW3dKga0,62182
121
+ pex/docs/html/search.html,sha256=Zakl6pGBNidDqcyyG_waBFL3t45cilvBD6DDerU8uvo,18169
122
122
  pex/docs/html/searchindex.js,sha256=R_L6Oveik_wlK5CmaE7YwRvmu81r6fd7jtnZUjfk1sA,18009
123
- pex/docs/html/whatispex.html,sha256=ob_WWBMP_o-f7lmEavgZmJPUWl6htiETID0YmPN4qZw,22754
124
- pex/docs/html/_pagefind/pagefind-entry.json,sha256=N-x0zIhpN2rGiqPYb_8-BSJ14qseaMVKSsShPGEeA6s,90
123
+ pex/docs/html/whatispex.html,sha256=FrCSfUwAjfEJa77DGOSGFY51zemyhpmzpNkKySsm9mk,22754
124
+ pex/docs/html/_pagefind/pagefind-entry.json,sha256=F8iqak_nhKOhkNuiy2Wbs3q-BtsZPwjxczv0O4QdDew,90
125
125
  pex/docs/html/_pagefind/pagefind-highlight.js,sha256=5hRyi7gOMY9tlTe-tbmDrVJpoxbnYxhbJeoGwtmCfXA,43944
126
126
  pex/docs/html/_pagefind/pagefind-modular-ui.css,sha256=ZTqynk3lYp9t319vzfXSs-tTmowH__ila4ziFWpXB4g,7336
127
127
  pex/docs/html/_pagefind/pagefind-modular-ui.js,sha256=-DCEOJ2cInrvjEGZFxCuYy81EMWbKHhMu4wivlJmUzE,14486
128
128
  pex/docs/html/_pagefind/pagefind-ui.css,sha256=GL61nVezuyVA4ynNRJejhEwUBxhBtx4rDYVlAgI_W1U,14486
129
129
  pex/docs/html/_pagefind/pagefind-ui.js,sha256=WQ3yec_CMkBKswl16Ig5N_zJzeCgL4z9y344TcJeKAQ,78367
130
- pex/docs/html/_pagefind/pagefind.en_f11d4148c9.pf_meta,sha256=SKqY4iuw8WsS8BaBA4uiAt73-NHN9kIbLOxDrXiKHvo,152
130
+ pex/docs/html/_pagefind/pagefind.en_4eb6e6f279.pf_meta,sha256=1VVd-JmIXnfYh57fSq84iZbVhGrBEX06WmyR4t13klE,152
131
131
  pex/docs/html/_pagefind/pagefind.js,sha256=Q-4jKyPif6awDU9x8IoWXTWoJJR1JZicegUYQ-QI4MA,32912
132
132
  pex/docs/html/_pagefind/wasm.en.pagefind,sha256=mG0TKIE7WXynsyg-tpiMZiVG2Hwebbt2UqFqlqdTTsE,70873
133
133
  pex/docs/html/_pagefind/wasm.unknown.pagefind,sha256=eAREknqQnc_y96pbl8eYz9zqfUXsqe64B7HwrQE2SkY,67202
134
- pex/docs/html/_pagefind/fragment/en_111cec6.pf_fragment,sha256=pN29pDRbB7tx6nkpWauwL7_IINEpQVmJL2yQDlQW9D4,360
135
- pex/docs/html/_pagefind/fragment/en_57535ac.pf_fragment,sha256=wQdacrJaMrr_acZoTFFXzz1XKpvODVVM3FwK5QkHW5Y,4848
136
- pex/docs/html/_pagefind/fragment/en_68579f8.pf_fragment,sha256=ad_a1VMQZ6hFuj7Vfk2hDlu3Ws_Q8H4x6MBVyGEqdaI,1158
137
- pex/docs/html/_pagefind/fragment/en_b915203.pf_fragment,sha256=zVQwlshIFcQ3LC8Vsbkg14Q_MYlu_q8--wb_AUU1GJw,3019
138
- pex/docs/html/_pagefind/fragment/en_d450b85.pf_fragment,sha256=Tq6eU4Hptf3ZFwxuzqSMXaTUSlKOnRqCAG-XQpIruFo,3648
139
- pex/docs/html/_pagefind/fragment/en_eb89be5.pf_fragment,sha256=Y_ScjMHDmb1Zk1Y4KpCDgrdzU8mMVgfQYkyAHNTeFaQ,6821
140
- pex/docs/html/_pagefind/fragment/en_ff882aa.pf_fragment,sha256=R5RYJips77VahtKQIvKTts609s8fz7eXNPL1jYBm_k0,370
141
- pex/docs/html/_pagefind/fragment/en_ffc2e0e.pf_fragment,sha256=puASyKA4tw77BKZa8l5ERrNsk8tr-byicTgRbJZz9OM,1142
142
- pex/docs/html/_pagefind/index/en_71e2485.pf_index,sha256=xvqfOmLMQ150z_YcenSyuZdJBTII8VPKvdGz257RB9g,28865
134
+ pex/docs/html/_pagefind/fragment/en_1caf19d.pf_fragment,sha256=fSUo8MMVcVWZ-o2Zk-WumtLxdJqBRuaDteLolIJvOJ0,369
135
+ pex/docs/html/_pagefind/fragment/en_2268ed8.pf_fragment,sha256=YtJbzbFGdbhvo77454kPY1lQ6VfK4duqbkC6ypxwawg,360
136
+ pex/docs/html/_pagefind/fragment/en_469c87d.pf_fragment,sha256=hVU52bY_Wn4jsZ_JyleodEz9pbURgB5pjsCzgyP_lBk,6821
137
+ pex/docs/html/_pagefind/fragment/en_4a75d8d.pf_fragment,sha256=MFbLe4zEElh2as446BJIajIWu_uBGIAszH2K5Zc52ls,1142
138
+ pex/docs/html/_pagefind/fragment/en_9fe4bcc.pf_fragment,sha256=621SOh9cnT-GQ9G7EkSCSVR5gzaHikAjuoQQml7N09I,4847
139
+ pex/docs/html/_pagefind/fragment/en_a951443.pf_fragment,sha256=h9w-CBjEKfBM7Pba-FQOIoPTRAUChwZnpptDKRBLmWM,3648
140
+ pex/docs/html/_pagefind/fragment/en_af1fb65.pf_fragment,sha256=fuHpeP6UrFdWvGiiEAIpmC6jILqnSYi4Xn-lvDIR1nc,3019
141
+ pex/docs/html/_pagefind/fragment/en_e0b014e.pf_fragment,sha256=UffRSQkll4itGiHWv7XT1TtgPunYyHZ5cikcI8ZmhC8,1158
142
+ pex/docs/html/_pagefind/index/en_f48c2e4.pf_index,sha256=PuVRMvbbtGNc11HWsHRIIL1jxvYIX5OuhfBX__Teero,28865
143
143
  pex/docs/html/_sources/buildingpex.rst.txt,sha256=87P3ZO871MILL9pmpDM8_M7_YV1z5HjTYa9m8yuxTa4,19138
144
144
  pex/docs/html/_sources/index.rst.txt,sha256=vWt1s6dirYeR-9mFJY1SClwWvbWqIqJSFCAF1CdZojc,1468
145
145
  pex/docs/html/_sources/recipes.rst.txt,sha256=kerzvp8_t5io6eGl3YJODtNBQy7GmY2AA6RHaij9C-g,6958
@@ -149,7 +149,7 @@ pex/docs/html/_sources/api/vars.md.txt,sha256=C9gu5czyB-g788xRfYKF8P176ew_q97X6z
149
149
  pex/docs/html/_static/basic.css,sha256=ZW_xus1vJg_H1xuX-cLx_L9pLchL9GnNlSA078ue7-0,14685
150
150
  pex/docs/html/_static/debug.css,sha256=DQXNnnnVMjQwRmfAjwKXHeYZbA_8pZPDkDs2Z7QFWtY,1266
151
151
  pex/docs/html/_static/doctools.js,sha256=KZLAnfkYJqjTPjtItkXud-RXrc98cS13aoFOHixEi0M,4322
152
- pex/docs/html/_static/documentation_options.js,sha256=HI_5GBCB6w76CHBjK_1HXIdeWHHQgeOPLi7FLkqXD_Y,329
152
+ pex/docs/html/_static/documentation_options.js,sha256=h06qvaWKMbza0MvL3bJy0mDYox8uD1YNy1ZSGd_R1h0,329
153
153
  pex/docs/html/_static/file.png,sha256=XEvJoWrr84xLlQ9ZuOUByjZJUyjLnrYiIYvOkGSjXj4,286
154
154
  pex/docs/html/_static/language_data.js,sha256=O8MRVjt_xegPyrL4Ypd0vzy2swICAA3zbf-OaVqQI7c,4598
155
155
  pex/docs/html/_static/minus.png,sha256=R-f8UNs2mfHKQc6aL_ogLADF0dUYDFX2K6hZsb1swAg,90
@@ -169,7 +169,7 @@ pex/docs/html/_static/styles/furo-extensions.css,sha256=PSsCB3EaBzE9-2yLJyKV9fkx
169
169
  pex/docs/html/_static/styles/furo-extensions.css.map,sha256=CzW267gfKqH8ruMlwJbWg-MsGAipIgZwoaP4gwDGkVw,7762
170
170
  pex/docs/html/_static/styles/furo.css,sha256=666beINeSQtLZbSeNCMj62G7a13xiX1YwJVvij3jr-8,50749
171
171
  pex/docs/html/_static/styles/furo.css.map,sha256=0k0kb9TwrJYQRT-2cbjTcOz7PQykGWHdy2BSuVMtrnY,76038
172
- pex/docs/html/api/vars.html,sha256=NEiRT0wQAIS7BPug3OBQfHln3HK-bfyFvK5MEoL2Pj0,34903
172
+ pex/docs/html/api/vars.html,sha256=hahWmNkn7TZ5lzO-RmaBENG6sxqBqJi3TAK3SiqXjNs,34903
173
173
  pex/fs/__init__.py,sha256=ues2bnsufy1lYRyoWsiP-G4kuPrV-tXaZ0x-HFJFpwY,3605
174
174
  pex/fs/_posix.py,sha256=p-VkjEfRNXduBmkxcuEXWM1g6y6xrkufSYzEy93tqjA,1275
175
175
  pex/fs/_windows.py,sha256=apacgHpxNutF5HkU6cYOLHq7yqaijRMsFBdsdKSviDo,3304
@@ -182,9 +182,9 @@ pex/pip/installation.py,sha256=CFykX2FEPygqO0jxMzPG-rvd2Eos8YJ2cviyMsOUayU,21301
182
182
  pex/pip/local_project.py,sha256=0HsnUgb0d1XX1TokVogF1xV-pTFNuBLDG-7K2j5VUVI,2040
183
183
  pex/pip/log_analyzer.py,sha256=YLecIWrjTBvDZA_OwvQlcR1gf6-rI_eBt_LFZTA2E-U,4362
184
184
  pex/pip/tailer.py,sha256=af7yJ1rxvtTltno1BEVgJ6lf1C0PPnCzCs6CWto7Y9s,4445
185
- pex/pip/tool.py,sha256=-D0YanfpDn1ftHFE5fqgUIFO16Wn0rzfB5vQKN3WDCg,37897
186
- pex/pip/vcs.py,sha256=6Kd_luDU3yfpqMYYQdlmskZpuldssrWGlsl1Tj7fdqE,4520
187
- pex/pip/version.py,sha256=oXScGU_Z18c-uzAr67f0U3NsxDXFEQ_FK-0Bnbn8YXs,12644
185
+ pex/pip/tool.py,sha256=CC9pN5b9cB9Poxt4aptsrOP19rx29dlZZotKHPwP8cY,37996
186
+ pex/pip/vcs.py,sha256=6CE2TBgaeuZ8pVS8qDsA_Dkx_MRNBnExREuCxohwQpM,6259
187
+ pex/pip/version.py,sha256=5CgNwIwrXVLMqoLOTV-gIMH1KLuQ8ELnfBWFM8_f00k,12812
188
188
  pex/pip/dependencies/__init__.py,sha256=Hwrin59pqb2QPU4ysCPUhqzfsE1PHx56a-ED39eEV0Q,5126
189
189
  pex/pip/dependencies/requires.py,sha256=OHEsklGHs05Ew5E-hb9q_lQ7ijHByNN_YRTlvy-iuiU,5419
190
190
  pex/pip/foreign_platform/__init__.py,sha256=MQ9I_K_rkL_nKGHG2GcwVfgrJ20vC2Rff8wPeVZchNM,7924
@@ -202,10 +202,10 @@ pex/resolve/config.py,sha256=2urR5rvh6pY8tZzUfRdUVGYrAY1iXURp_N4lrnXIdJA,3362
202
202
  pex/resolve/configured_resolve.py,sha256=jd-lVJjXXtNlEbTlfaRpprETcDAywrpmm2Hpu0-T9ns,9617
203
203
  pex/resolve/configured_resolver.py,sha256=MRzp1hVHl7ooKHEhESN7oxMd5fOpxuXOGYiUXZe0Yww,3457
204
204
  pex/resolve/downloads.py,sha256=8R4GI-PSSLw2qv6XKsGyDFEiugfJgw2G6F4lywtU_Xk,7074
205
- pex/resolve/lock_downloader.py,sha256=RbG7bdwxx-k7U1k_Kpipb4Po3bdPhk6Rv5gt7yZrAVw,15347
205
+ pex/resolve/lock_downloader.py,sha256=wFWWPg1IWwLCAHN43ci28nqCrodmZM8mmKtMRW45O4M,15386
206
206
  pex/resolve/lock_resolver.py,sha256=b6UoqaXPNdWEt1JC8S6HSc4el5ows6kmIa5T87OsAm0,23398
207
207
  pex/resolve/locked_resolve.py,sha256=h47WC84zHgE1H3kf9OahfSa_df0fEfxtIWeLX7stK50,40672
208
- pex/resolve/locker.py,sha256=f0T9R97w8F0-GPSoXAG6YmgKs_wTjue4iPRk8WAjTcw,29816
208
+ pex/resolve/locker.py,sha256=PdTsNF66GJmCRilk_POEGZ7eZP3aoTg6UNPIDfUlpmY,30421
209
209
  pex/resolve/locker_patches.py,sha256=KttN07cCok3ajNm5TLzsZhBTPmPDyO33WkDbE4G9TB4,8043
210
210
  pex/resolve/package_repository.py,sha256=xMU9aTxojS2sNmWp03jfMBTIGhq3eqNuNOacl8BiiGY,15123
211
211
  pex/resolve/path_mappings.py,sha256=d6JVzD0K342ELz3O8AcsaXoikLDF3xYrgbXkixMmf3Q,2073
@@ -985,10 +985,10 @@ pex/windows/stubs/uv-trampoline-aarch64-console.exe,sha256=1S2aM-6CV7rKz-3ncM5X7
985
985
  pex/windows/stubs/uv-trampoline-aarch64-gui.exe,sha256=mb8x1FpyH-wy11X5YgWfqh_VUwBb62M4Zf9aFr5V4EE,40448
986
986
  pex/windows/stubs/uv-trampoline-x86_64-console.exe,sha256=nLopBrlCMMFjkKVRlY7Ke2zFGpQOyF5mSlLs0d7-HRQ,40960
987
987
  pex/windows/stubs/uv-trampoline-x86_64-gui.exe,sha256=icnp1oXrOZpc-dHTGvDbTHjr-D8M0eamvRrC9bPI_KI,41984
988
- pex-2.65.0.dist-info/METADATA,sha256=12uYLeVXM-y1zPeSIMHj83BVgP2W9O-qBZ20kZxDOAQ,7476
989
- pex-2.65.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
990
- pex-2.65.0.dist-info/entry_points.txt,sha256=LD9tcxNxdsVLeIF6zR7dyH1vgo2eD9a-05TC1UraGMQ,174
991
- pex-2.65.0.dist-info/top_level.txt,sha256=HlafJUPu7mfjxv3SDH-RbkxsHOWSVbPXTEBC1hzonpM,4
992
- pex-2.65.0.dist-info/licenses/LICENSE,sha256=bcDgaNzzpbyOBUIFuFt3IOHUkmW7xkv1FdLPeRl99po,11323
993
- pex-2.65.0.dist-info/pylock/pylock.toml,sha256=9TIk5X6BqnJ6lKu8eb0EnzwbBcOjs3QJWzcLMYx8M5k,7151
994
- pex-2.65.0.dist-info/RECORD,,
988
+ pex-2.66.0.dist-info/METADATA,sha256=DDpyoO3f02WzA8ozzhI-_mHe2XPV-_PzJz2h0imap8w,7476
989
+ pex-2.66.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
990
+ pex-2.66.0.dist-info/entry_points.txt,sha256=LD9tcxNxdsVLeIF6zR7dyH1vgo2eD9a-05TC1UraGMQ,174
991
+ pex-2.66.0.dist-info/top_level.txt,sha256=HlafJUPu7mfjxv3SDH-RbkxsHOWSVbPXTEBC1hzonpM,4
992
+ pex-2.66.0.dist-info/licenses/LICENSE,sha256=bcDgaNzzpbyOBUIFuFt3IOHUkmW7xkv1FdLPeRl99po,11323
993
+ pex-2.66.0.dist-info/pylock/pylock.toml,sha256=9TIk5X6BqnJ6lKu8eb0EnzwbBcOjs3QJWzcLMYx8M5k,7151
994
+ pex-2.66.0.dist-info/RECORD,,
File without changes