internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: pex-tool/pex

Issue:
Release 2.1.24
On the docket:
+ [x] Python 3.9.1 release reverts pex to 2.0.3 #1141
+ [x] Upgrade to a patched Pip 20.3.3. #1143



Discussion:
Truncated the docket over to the 2.1.25 release tracked by #1144 in order to get out the Pip upgrade for Pants consumption.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.23"
+__version__ = "2.1.24"


Test patch:
Repository: pex-tool/pex

Issue:
PexInfo.copy does not copy its collection attributes.
The copy method was oversimplified in #1127 and now only copies the dict backing the non-collection attributes of PexInfo.


Discussion:

Resolving patch:
diff --git a/pex/pex_info.py b/pex/pex_info.py
--- a/pex/pex_info.py
+++ b/pex/pex_info.py
@@ -394,7 +394,7 @@ def dump(self):
 
     def copy(self):
         # type: () -> PexInfo
-        return PexInfo(self._pex_info)
+        return PexInfo(self.as_json_dict())
 
     @staticmethod
     def _merge_split(*paths):


Test patch:
diff --git a/tests/test_pex_info.py b/tests/test_pex_info.py
--- a/tests/test_pex_info.py
+++ b/tests/test_pex_info.py
@@ -7,6 +7,7 @@
 import pytest
 
 from pex.common import temporary_dir
+from pex.inherit_path import InheritPath
 from pex.orderedset import OrderedSet
 from pex.pex_info import PexInfo
 from pex.pex_warnings import PEXWarning
@@ -142,3 +143,31 @@ def test_pex_root_set_unwriteable():
         assert isinstance(message, PEXWarning)
         assert pex_root in str(message)
         assert pex_info.pex_root in str(message)
+
+
+def test_copy():
+    # type: () -> None
+    default_info = PexInfo.default()
+    default_info_copy = default_info.copy()
+    assert default_info is not default_info_copy
+    assert default_info.dump() == default_info_copy.dump()
+
+    info = PexInfo.default()
+    info.unzip = True
+    info.code_hash = "foo"
+    info.inherit_path = InheritPath.FALLBACK
+    info.add_requirement("bar==1")
+    info.add_requirement("baz==2")
+    info.add_distribution("bar.whl", "bar-sha")
+    info.add_distribution("baz.whl", "baz-sha")
+    info.add_interpreter_constraint(">=2.7.18")
+    info.add_interpreter_constraint("CPython==2.7.9")
+    info_copy = info.copy()
+
+    assert info_copy.unzip is True
+    assert "foo" == info_copy.code_hash
+    assert InheritPath.FALLBACK == info_copy.inherit_path
+    assert OrderedSet(["bar==1", "baz==2"]) == info_copy.requirements
+    assert {"bar.whl": "bar-sha", "baz.whl": "baz-sha"} == info_copy.distributions
+    assert {">=2.7.18", "CPython==2.7.9"} == set(info_copy.interpreter_constraints)
+    assert info.dump() == info_copy.dump()
Repository: pex-tool/pex

Issue:
Requires-Python handling causes LegacyVersion warning
This warning is out of user control but we can re-work our version parsing to avoid it.

As reported in https://github.com/pantsbuild/pants/issues/11305 - looks like:
```
12:47:44 [WARN] /Users/alfredo/.cache/pants/setup/bootstrap-Darwin-x86_64/pants.wY8Gbf/install/lib/python3.8/site-packages/pex/vendor/_vendored/packaging/packaging/version.py:127: DeprecationWarning: Creating a LegacyVersion has been deprecated and will be removed in the next major release
  warnings.warn(
```

Our triggering code does not directly use `packaging.version.LegacyVersion`, but the `packaging.version.parse` API it uses (aliased as `parse_version`) does fall back to it:
https://github.com/pantsbuild/pex/blob/430e25f0b3435e333e53abadcbdef33421dfe51a/pex/resolver.py#L129-L142




Discussion:

Resolving patch:
diff --git a/pex/resolver.py b/pex/resolver.py
--- a/pex/resolver.py
+++ b/pex/resolver.py
@@ -23,8 +23,7 @@
 from pex.platforms import Platform
 from pex.requirements import ReqInfo, URLFetcher, parse_requirement_file, parse_requirement_strings
 from pex.third_party.packaging.markers import Marker
-from pex.third_party.packaging.version import Version
-from pex.third_party.packaging.version import parse as parse_version
+from pex.third_party.packaging.version import InvalidVersion, Version
 from pex.third_party.pkg_resources import Distribution, Environment, Requirement
 from pex.tracer import TRACER
 from pex.util import CacheHelper
@@ -135,11 +134,17 @@ def to_requirement(self, dist):
 
             def choose_marker(version):
                 # type: (str) -> str
-                parsed_version = parse_version(version)
-                if type(parsed_version) != Version or len(parsed_version.release) > 2:
+                try:
+                    parsed_version = Version(version)
+                    if len(parsed_version.release) > 2:
+                        return "python_full_version"
+                    else:
+                        return "python_version"
+                except InvalidVersion:
+                    # Versions in a version specifier can be globs like `2.7.*` which do not parse
+                    # as valid Versions and should be matched with python_full_version.
+                    # See: https://www.python.org/dev/peps/pep-0440/#version-matching.
                     return "python_full_version"
-                else:
-                    return "python_version"
 
             markers.update(
                 Marker(python_version)


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.25
On the docket:
+ [x] Use symlinks to add dists in the Pex CLI. #1185
+ [x] Support PEX files as resolve repositories. #1108
+ [x] Pex does not use the pip 2020-resolver when resolving for Python 2.7 #1179
+ [x] PexInfo.copy does not copy its collection attributes. #1147
+ [x] Add support for PEX_INTERPRETER `-c`, `-m` and `-` special modes to PEX venvs. #1136
+ [x] Requires-Python handling causes LegacyVersion warning #1150
+ [x] Add option to extend PATH with additional console scripts #1097
+ [x] Removing "activation" time from PEX #1115
+ [x] Run PEXes as normal applications #962
+ [x] Top level environment markers are lost in built PEXes. #899
+ [x] Using `--resolver-version=pip-2020-resolver` yields poor dependency conflict information. #1159


Discussion:
Broke off #1186 to take up the overflow items into 2.1.26 so 2.1.25 is ready for release tomorrow.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.24"
+__version__ = "2.1.25"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.26
On the docket:
+ [x] Pex requirement parsing is tripped up by files in the CWD with the same name as requirements' project names. #1188


Discussion:

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.25"
+__version__ = "2.1.26"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.27
On the docket:
+ [x] Cannot build PEX with relative path for --sources-directory. #1192


Discussion:

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.26"
+__version__ = "2.1.27"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.28
On the docket:
+ [x] Pex resolver fails to evaluate markers when post-processing resolves to identify which dists satisfy direct requirements. #1196


Discussion:

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.27"
+__version__ = "2.1.28"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.31
On the docket:
+ [x] When Pex is run from a Pex PEX its isolation is broken. #1232
+ [x] The `--venv` mode `pex` script does not have a `__name__ == '__main__'` guard breaking multiprocessing. #1236
+ [x] The `--seed` mode for a `--venv` PEX is unsafe. #1239
+ [x] The venv `pex` script handles entrypoint functions differently from PEX. #1241
+ [x] Interpreter identification leaks an unconstrained `$PWD` entry into `sys.path`. #1231
+ [x] Support control of venv creation mode `--copies` vs. `--symlinks` #1230


Discussion:
Maybes moved over to 2.1.32 in #1237.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.30"
+__version__ = "2.1.31"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.32
On the docket:
+ [x] Venv `pex` and bin scripts can run afoul of shebang length limits. #1252


Discussion:
Moved prior docket to 2.1.33 in #1253.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.31"
+__version__ = "2.1.32"


Test patch:
Repository: pex-tool/pex

Issue:
Pex verbose log output partially goes to stdout.
When Pex logging is turned up to verbosity level 3 or higher, Pip verbose logging is engaged and some of Pip's logging goes to stdout. Since Pip views the mixed stdout / stderr logging discipline as a feature and not a bug (C.F.: https://github.com/pypa/pip/issues/9420), Pex should deal with this problem on its side.


Discussion:

Resolving patch:
diff --git a/pex/pip.py b/pex/pip.py
--- a/pex/pip.py
+++ b/pex/pip.py
@@ -323,8 +323,18 @@ def _spawn_pip_isolated(
             from pex.pex import PEX
 
             pip = PEX(pex=self._pip_pex_path, interpreter=python_interpreter)
+
+            # Pip has no discernable stdout / stderr discipline with its logging. Pex guarantees
+            # stdout will only contain useable (parseable) data and all logging will go to stderr.
+            # To uphold the Pex standard, force Pip to comply by re-directing stdout to stderr.
+            #
+            # See:
+            # + https://github.com/pantsbuild/pex/issues/1267
+            # + https://github.com/pypa/pip/issues/9420
+            stdout = popen_kwargs.pop("stdout", sys.stderr.fileno())
+
             return pip.cmdline(command), pip.run(
-                args=command, env=env, blocking=False, **popen_kwargs
+                args=command, env=env, blocking=False, stdout=stdout, **popen_kwargs
             )
 
     def _spawn_pip_isolated_job(


Test patch:
diff --git a/tests/test_integration.py b/tests/test_integration.py
--- a/tests/test_integration.py
+++ b/tests/test_integration.py
@@ -2876,7 +2876,7 @@ def test_seed(
 ):
     # type: (...) -> None
     pex_file, args = isort_pex_args
-    results = run_pex_command(args=args + mode_args + ["--seed"], quiet=True)
+    results = run_pex_command(args=args + mode_args + ["--seed"])
     results.assert_success()
 
     # Setting posix=False works around this issue under pypy: https://bugs.python.org/issue1170.
Repository: pex-tool/pex

Issue:
Allow command-line arguments to be read from a file
Various tools, including [gcc](https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html#Overall-Options) and [clang](https://llvm.org/docs/CommandLine.html#response-files), allow command-line arguments to be read from a file.  This is typically done by designating a special character (@) to indicate that the argument is to be interpreted as a file of arguments.  This behavior is helpful when the command-line length may become greater than the maximum size allowed by the system.

Would there be interest in adding the ability to pass command-line argument from a file to pex?  I would be happy to submit a pull request with the needed changes if there is interest. I suspect the needed changes would be minimal as ArgumentParser supports this behavior with its [`fromfile_prefix_chars`](https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars) parameter.  

I know I occasionally have the need to pass a large number of resource directories to the pex command and worry about reaching the limits of my systems command-line length.


Discussion:
SGTM! Thanks @jjhelmus.

Resolving patch:
diff --git a/pex/bin/pex.py b/pex/bin/pex.py
--- a/pex/bin/pex.py
+++ b/pex/bin/pex.py
@@ -635,9 +635,16 @@ def configure_clp():
         "%(prog)s [-o OUTPUT.PEX] [options] [-- arg1 arg2 ...]\n\n"
         "%(prog)s builds a PEX (Python Executable) file based on the given specifications: "
         "sources, requirements, their dependencies and other options."
+        "\n"
+        "Command-line options can be provided in one or more files by prefixing the filenames "
+        "with an @ symbol. These files must contain one argument per line."
     )
 
-    parser = ArgumentParser(usage=usage, formatter_class=ArgumentDefaultsHelpFormatter)
+    parser = ArgumentParser(
+        usage=usage,
+        formatter_class=ArgumentDefaultsHelpFormatter,
+        fromfile_prefix_chars="@",
+    )
 
     parser.add_argument("--version", action="version", version=__version__)
     parser.add_argument("requirements", nargs="*", help="Requirements to add to the pex")


Test patch:
diff --git a/tests/test_pex_binary.py b/tests/test_pex_binary.py
--- a/tests/test_pex_binary.py
+++ b/tests/test_pex_binary.py
@@ -124,6 +124,17 @@ def test_clp_constraints_txt():
     assert options.constraint_files == ["requirements1.txt"]
 
 
+def test_clp_arg_file():
+    # type: () -> None
+    with NamedTemporaryFile() as tmpfile:
+        tmpfile.write(to_bytes("-r\nrequirements1.txt\r-r\nrequirements2.txt"))
+        tmpfile.flush()
+
+        parser = configure_clp()
+        options = parser.parse_args(args=["@" + tmpfile.name])
+        assert options.requirement_files == ["requirements1.txt", "requirements2.txt"]
+
+
 def test_clp_preamble_file():
     # type: () -> None
     with NamedTemporaryFile() as tmpfile:
Repository: pex-tool/pex

Issue:
Release 2.1.34
On the docket:
+ [x] Allow command-line arguments to be read from a file #1271
+ [x] Issue when running a module inside pex file #1018
+ [x] Guard against concurrent re-imports. #1270
+ [x] Ensure Pip logs to stderr. #1268



Discussion:
Moved from Release 2.1.33 in #1253 to make way for a hotfix for #1201.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.33"
+__version__ = "2.1.34"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.35
On the docket:
+ [x] Ensure venv pex does not enter a re-exec loop. #1286
+ [x]  Improve resolve error information. #1287 
+ [x] Expose Pex tools via a pex-tools console script. #1279
+ [x] Fix auto-created `--venv` core scripts. (#1278)



Discussion:
Moved from Release 2.1.34 in #1263 to make way for a hotfix for #1267.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.34"
+__version__ = "2.1.35"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.36
On the docket:
+ [x] Add support for --seed verbose. #1299
+ [x] PEXBuilder symlinked wheel install chroots can observe compilation. #1297
+ [x] Pex builds wheels with bad platform tags on some mac machines. #1294



Discussion:
Forked off from Release 2.1.35 #1269.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.35"
+__version__ = "2.1.36"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.38
On the docket:
+ [ ] PEX direct requirement metadata for resolves via Pip is incorrect. #1311


Discussion:
Moved from Release 2.1.37 #1295 to make way for a bugfix release.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.37"
+__version__ = "2.1.38"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.39
On the docket:
+ [x] Running opvault 0.4.9 pex leads to infinite recursion in setup tools #1316


Discussion:
Docket carried over from Release 2.1.38 #1306.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.38"
+__version__ = "2.1.39"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.40
On the docket:
+ [x] PEX_* environment variable are not stripped in '--venv' mode #1326
+ [x] Fix pyenv shim identification. #1325



Discussion:
Docket moved from Release 2.1.39 #1313 to make way fr a hotfix release.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.39"
+__version__ = "2.1.40"


Test patch:
Repository: pex-tool/pex

Issue:
Pex fail to build wheels when target is just a major version on macos. 
From https://github.com/pantsbuild/pants/issues/11967

When `MACOSX_DEPLOYMENT_TARGET=11` we get an invalid platform tag:
```
macosx-['11'].0-x86_64
```

Caused by the fix for #1294 



Discussion:

Resolving patch:
diff --git a/pex/interpreter.py b/pex/interpreter.py
--- a/pex/interpreter.py
+++ b/pex/interpreter.py
@@ -1088,7 +1088,7 @@ def create_isolated_cmd(
             release = self._identity.configured_macosx_deployment_target
             version = release.split(".")
             if len(version) == 1:
-                release = "{}.0".format(version)
+                release = "{}.0".format(version[0])
             elif len(version) > 2:
                 release = ".".join(version[:2])
 


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.41
On the docket:
+ [x] Pex fail to build wheels when target is just a major version on macos. #1331


Discussion:
Docket moved from Release 2.1.40 #1318 to make way for pyenv shims handling and a venv mode env var scrubbing fix.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.40"
+__version__ = "2.1.41"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.42
On the docket:
+ [ ] Unable to install source distributions for Python 3.8 #1336
+ [ ] PEX builds broken on Big Sur after recent update #1337


Discussion:
Moved from Release 2.1.41 #1327 to make way for a bugfix for #1331.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.41"
+__version__ = "2.1.42"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.43
On the docket:
+ [x] Support more verbose output for interpreter info. (#1347) 
+ [x] Fix Pex emitting warnings about its Pip PEX venv. (#1351)
+ [x] Fix execution modes. (#1353) 
+ [x] Warn for PEX env vars unsupported by venv. (#1354)
+ [x] Do not suppress pex output in bidst_pex (#1358)
+ [x] Using --platform manylinux2010 includes pyarrow wheel for manylinux2014 #1355
+ [x] Fix --no-manylinux. #1365
+ [x] Environment markers are incorrectly evaluated for --platform resolves. #1366
+ [x] Pex probes wheel metadata incorrectly. #1375


Discussion:
Moved from Release 2.1.42 #1333 to make way for a bugfixes for #1336 and #1337.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.42"
+__version__ = "2.1.43"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.44
On the docket:
+ [x] Pex Pip code fails to handle PEX_ env vars being present in the ambient environment. #1387


Discussion:
Split off from release 2.1.43 #1340 to make room for a few more pressing changes.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.43"
+__version__ = "2.1.44"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.45
On the docket:
+ [x] Fix --bdist-all handling multiple console_scripts #1396



Discussion:
Split off from "Release 2.1.44 #1363" to make way for a fix for #1387.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.44"
+__version__ = "2.1.45"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.46
On the docket:
+ [x] Fix Pip proprietary URL env marker handling. #1417 
+ [x] Un-reify installed wheel script shebangs. #1410
+ [x] Support deterministic repository extract tool. #1411
+ [x] support setuptools scripts #1379



Discussion:
Split off from "Release 2.1.45 #1389" to make way for the #1396 bdist_all fix.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.45"
+__version__ = "2.1.46"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.48
On the docket:
+ [x]  Remove zipapp execution mode & introduce --layout. #1438 


Discussion:
Split off from " Release 2.1.47 #1418 " to make way for a venv dir hashing bug fix.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.47"
+__version__ = "2.1.48"


Test patch:
Repository: pex-tool/pex

Issue:
Release 2.1.49
On the docket:
+ [ ]  Avoid re-using old ~/.pex/code/ caches. #1444 


Discussion:
Split off from  "Release 2.1.48 #1433" to make way for the `--layout` feature.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,4 +1,4 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = "2.1.48"
+__version__ = "2.1.49"


Test patch: