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

Issue:
Exit code 120 with python3.6
When trying to move to `python3.6` I noticed that our py.test builds are failing because the exit code of any PEX run is 120. This doesn't seem happen with `python3.5`. I'm observing this on arch linux as well as in a `ubuntu14.04` docker image.

To reproduce, create a pex file then launch it, exit with CTRL+D and check the return code.

```
$pex -o mypex
$./mypex
Python 3.6.0 (default, Dec 24 2016, 08:03:08) 
[GCC 6.2.1 20160830] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
now exiting InteractiveConsole...
$echo $?
120
```


Discussion:
This looks like it's related https://bugs.python.org/issue29130.

Resolving patch:
diff --git a/pex/pex.py b/pex/pex.py
--- a/pex/pex.py
+++ b/pex/pex.py
@@ -31,6 +31,9 @@ def __init__(self):
   def write(self, *args, **kw):
     pass
 
+  def flush(self):
+    pass
+
 
 class PEX(object):  # noqa: T000
   """PEX, n. A self-contained python environment."""


Test patch:
Repository: pex-tool/pex

Issue:
Pex is no longer self-contained
In particular, its dependency on packaging is not included in the `.bootstrap` which can lead to errors when used as a library.


Discussion:

Resolving patch:
diff --git a/pex/package.py b/pex/package.py
--- a/pex/package.py
+++ b/pex/package.py
@@ -3,7 +3,6 @@
 
 import os
 
-from packaging.specifiers import SpecifierSet
 from pkg_resources import EGG_NAME, parse_version, safe_name, safe_version
 
 from .archiver import Archiver
@@ -80,15 +79,10 @@ def satisfies(self, requirement, allow_prereleases=False):
     link_name = safe_name(self.name).lower()
     if link_name != requirement.key:
       return False
-
-    # TODO(John Sirois): This is a bit roundabout. Modern setuptools `Requirement` objects expose a
-    # `specifiers` field which is a `SpecifierSet`, but we can't be sure we have that. We can be
-    # sure though we have the `Requirement.specs` list of `(op, version)` tuples in all versions of
-    # setuptools we depend upon (we use `Requirement.specs` elsewhere in the codebase as well).
-    # Kill this re-parsing once our lower-bound setuptools dependency give access to
-    # `Requirement.specifiers`.
-    specifiers = ','.join(op + version for op, version in requirement.specs)
-    return self.raw_version in SpecifierSet(specifiers, prereleases=allow_prereleases)
+    # NB: If we upgrade to setuptools>=34 the SpecifierSet used here (requirement.specifier) will
+    # come from a non-vendored `packaging` package and pex's bootstrap code in `PEXBuilder` will
+    # need an update.
+    return requirement.specifier.contains(self.raw_version, prereleases=allow_prereleases)
 
   def compatible(self, identity, platform=Platform.current()):
     """Is this link compatible with the given :class:`PythonIdentity` identity and platform?
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,8 +1,11 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = '1.2.0'
+__version__ = '1.2.1'
 
-PACKAGING_REQUIREMENT = 'packaging>=16.8,<17.0'
+# NB: If we upgrade to setuptools>=34 pex's bootstrap code in `PEXBuilder` will need an update to
+# include the `packaging` package in the `.bootstrap/` code since we use
+# `packaging.specifiers.SpecifierSet` - indirectly - through `pkg_resources.Requirement.specifier`.
 SETUPTOOLS_REQUIREMENT = 'setuptools>=20.0,<34.0'
+
 WHEEL_REQUIREMENT = 'wheel>=0.26.0,<0.30.0'
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -53,7 +53,6 @@
     'pex.commands',
   ],
   install_requires = [
-    PACKAGING_REQUIREMENT,
     SETUPTOOLS_REQUIREMENT,
   ],
   tests_require = [


Test patch:
Repository: pex-tool/pex

Issue:
Pex silently builds bad pexfile
This is on OSX against `pex 1.4.2` using `python 2.7.13`.
Same command works against `pex 1.3.2`

Command:
```
$ pex -r requirements.txt -o env.pex
```

Contents of `requirements.txt`:
```
# === Main Dependencies
flask>=0.0
pathlib2
dulwich
pandas
codenamize
pyOpenSSL>=16.2.0
jupyter
```

When attempting to run `env.pex`:

```
$ ./env.pex
Failed to execute PEX file, missing macosx_10_12_x86_64-cp-27-cp27m compatible dependencies for:
ipython
appnope
```

Interestingly, changing the `requirements.txt` to include `appnope` and `ipython==5.7` explicitly fixes it against `pex 1.4.2`.

As mentioned, the same works either way against `pex 1.3.2`.


Discussion:
thanks for the bug report, we'll take a look.
confirming a regression and minimal repro on OSX:

```
[omerta ~]$ pex pex==1.3.2 -c pex -o ./pex1.3.2.pex
[omerta ~]$ pex pex==1.4.2 -c pex -o ./pex1.4.2.pex
[omerta ~]$ ./pex1.3.2.pex jupyter
Python 2.7.13 (default, Mar  2 2017, 16:22:01) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import appnope
>>> 
[omerta ~]$ ./pex1.4.2.pex jupyter
Failed to execute PEX file, missing macosx_10_13_x86_64-cp-27-cp27m compatible dependencies for:
ipython
appnope
[omerta ~]$
```

this relates to PEP496 environmental markers support - which appear to be correctly checked at runtime, but not considered at buildtime.

Resolving patch:
diff --git a/pex/resolver.py b/pex/resolver.py
--- a/pex/resolver.py
+++ b/pex/resolver.py
@@ -256,7 +256,9 @@ def resolve(self, resolvables, resolvable_set=None):
         new_parent = '%s->%s' % (parent, resolvable) if parent else str(resolvable)
         # We patch packaging.markers.default_environment here so we find optional reqs for the
         # platform we're building the PEX for, rather than the one we're on.
-        with patched_packing_env(self._interpreter.identity.pkg_resources_env(self._platform)):
+        with patched_packing_env(
+          self._interpreter.identity.pkg_resources_env(self._platform.platform)
+        ):
           resolvables.extend(
             (ResolvableRequirement(req, resolvable.options), new_parent) for req in
             distribution.requires(extras=resolvable_set.extras(resolvable.name))


Test patch:
diff --git a/tests/test_integration.py b/tests/test_integration.py
--- a/tests/test_integration.py
+++ b/tests/test_integration.py
@@ -869,3 +869,14 @@ def test_platform_specific_egg_resolution_matching():
                            'netifaces==0.10.6',  # Only provides win32 eggs.
                            '-o', pex_out_path])
     res.assert_failure()
+
+
+@pytest.mark.skipif(NOT_CPYTHON27)
+def test_jupyter_appnope_env_markers():
+  res = run_pex_command(['--disable-cache',
+                         'jupyter==1.0.0',
+                         '-c', 'jupyter',
+                         '--',
+                         '--version'])
+  res.assert_success()
+  assert len(res.output) > 4
Repository: pex-tool/pex

Issue:
Release 1.4.5
docket of user-facing issues fixed:
+ #158 
+ #522
+ #508
+ #527
+ #509
+ #510



Discussion:
/cc @CMLivingston - if you're interested in progress on the release fixing #522 this issue tracks.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,7 +1,7 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = '1.4.4'
+__version__ = '1.4.5'
 
 # NB: If we upgrade to setuptools>=34 pex's bootstrap code in `PEXBuilder` will need an update to
 # include the `packaging` package in the `.bootstrap/` code since we use


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.4.6
docket of user-facing issues fixed:
+ chroot perm preservation #536
+ setuptools: expand supported range #541
+ setuptools: do not shadow user supplied setuptools #437
+ -c does not work for multiplatform pexes #537



Discussion:
Can we get this released sooner rather than later?
This update is becoming really important: https://github.com/pantsbuild/pex/blob/master/pex/version.py#L8

Build tooling that relies on _pex_ is encountering more and more issues with packages that declare conditional dependencies in `install_requires` instead of `extras_require`. For example, https://github.com/mcmtroffaes/pathlib2/issues/46

There are others: cryptography, importlib_resources, ...
The new release would **really** help.
+1
Thanks for the feedback on current pain - I did not know! I'll expedite this with a release by tomorrow morning.
Thank you!

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,7 +1,7 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = '1.4.5'
+__version__ = '1.4.6'
 
 # Versions 34.0.0 through 35.0.2 (last pre-36.0.0) de-vendored dependencies which causes problems
 # for pex code so we exclude that range.


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.4.7
docket of user-facing issues fixed:
+ #550: Pex 1.4.6 builds a failing pex


Discussion:

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,7 +1,7 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = '1.4.6'
+__version__ = '1.4.7'
 
 # Versions 34.0.0 through 35.0.2 (last pre-36.0.0) de-vendored dependencies which causes problems
 # for pex code so we exclude that range.
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -29,6 +29,7 @@
   version = __version__,
   description = "The PEX packaging toolchain.",
   long_description = LONG_DESCRIPTION,
+  long_description_content_type="text/x-rst",
   url = 'https://github.com/pantsbuild/pex',
   license = 'Apache License, Version 2.0',
   zip_safe = True,


Test patch:
Repository: pex-tool/pex

Issue:
non-zip_safe pex extraction has a race on renaming
If a particular non-zip_safe pex is run multiple times in parallel, there can be a race unpacking it into the unsafe_zip_cache_dir.

https://github.com/pantsbuild/pex/blob/1600d5b8d4a3a85fa8c6e17d0525da794a1f915a/pex/environment.py#L38-L52

Possible fixes
- add a file lock
- use a construct like 'safe_concurrent_creation` in pants does

https://github.com/pantsbuild/pants/blob/5d850fcadeb3da5e3a3fa075595f9e3bf2e32a47/src/python/pants/util/dirutil.py#L361


Discussion:
I'll take a look at this one today/tomorrow.

Resolving patch:
diff --git a/pex/environment.py b/pex/environment.py
--- a/pex/environment.py
+++ b/pex/environment.py
@@ -17,7 +17,7 @@
     find_distributions
 )
 
-from .common import die, open_zip, safe_mkdir, safe_rmtree
+from .common import die, open_zip, rename_if_empty, safe_mkdir, safe_rmtree
 from .interpreter import PythonInterpreter
 from .package import distribution_compatible
 from .pex_builder import PEXBuilder
@@ -49,7 +49,7 @@ def force_local(cls, pex, pex_info):
           safe_rmtree(explode_tmp)
           raise
       TRACER.log('Renaming %s to %s' % (explode_tmp, explode_dir))
-      os.rename(explode_tmp, explode_dir)
+      rename_if_empty(explode_tmp, explode_dir)
     return explode_dir
 
   @classmethod


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.4.8
User facing issues on the docket:
+ non-zip_safe pex extraction has a race on renaming #557
+ Execute pex archive at runtime with -m parameter #547
+ OSX's python 2.7.10 interpreter reports a bad local platform, bdists fail to resolve #523 
+ `pex.resolver.resolve` does the wrong thing when given an `interpreter` and no `platform` #511
+ [Errno 13] Permission denied when executing with bdist_pex #570



Discussion:
The #563 fixes would just so happen to solve a big problem for me right now, we have surprising demand for 'task runners' in python that the -m or -c at runtime would gracefully solve

I'm asking 100% out of curiosity, is there an ETA until this drops? And will -m/-c at runtime work with any future pex artifacts built with 1.4.8? 
I've been aiming for release the last 4 days - today should be the day and we'll support `-m` and `-c` at least until `python` drops or changes support - the ~whole point is to act like a hermetic `python` interpreter.

NB: Pex has supported (`pex --help-varables`) the `-m` behavior via environment variables for a very long time:
```
$ PEX_MODULE=app:main ./app.pex
$ PEX_MODULE=tool:fix ./app.pex
```
So the -m support just allows you to switch from the `PEX_MODULE` env-var to the `-m` option like `python` uses.


Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,7 +1,7 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = '1.4.7'
+__version__ = '1.4.8'
 
 # Versions 34.0.0 through 35.0.2 (last pre-36.0.0) de-vendored dependencies which causes problems
 # for pex code so we exclude that range.


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.5.2
User facing issues on the docket:
+ pex uses the wrong 'project name' for finding scripts in wheel files #443
+ --script not working with aws-cfn-bootstrap #551
+ Pex exits with correct code when using entrypoint #605
+ Update PyPI default URL to pypi.org #610


Discussion:
I'm moving #599 out of this release to unblock getting some of the other fixes released.

Resolving patch:
diff --git a/pex/version.py b/pex/version.py
--- a/pex/version.py
+++ b/pex/version.py
@@ -1,7 +1,7 @@
 # Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
 # Licensed under the Apache License, Version 2.0 (see LICENSE).
 
-__version__ = '1.5.1'
+__version__ = '1.5.2'
 
 # Versions 34.0.0 through 35.0.2 (last pre-36.0.0) de-vendored dependencies which causes problems
 # for pex code so we exclude that range.


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.0
On the docket:
+ (longterm fix) unhandled AttributeError during pex bootstrapping with PEX_PATH #598
+ Vendor setuptools / wheel. #607


Discussion:
This release will include #598 which was yanked from 1.5.2 release in #602.
Moved the potentials to 1.6.1 in #629.

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__ = '1.5.3'
+__version__ = '1.6.0'


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.2
On the docket:
+ [X] pex 1.6.1 cannot build cryptography 2.5 #661
+ [x] Allow pex to be invoked using runpy (python -m pex). #637 
+ [x] Add User-Agent header when resolving via urllib #663 



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__ = '1.6.1'
+__version__ = '1.6.2'


Test patch:
Repository: pex-tool/pex

Issue:
Restore pex.pex_bootstrapper.is_compressed API
#680 broke https://github.com/wickman/lambdex which has a dependency on this removed function. https://github.com/wickman/lambdex/issues/5 is filed to remove this un-necessary dependence going forward.


Discussion:

Resolving patch:
diff --git a/pex/pex_bootstrapper.py b/pex/pex_bootstrapper.py
--- a/pex/pex_bootstrapper.py
+++ b/pex/pex_bootstrapper.py
@@ -156,6 +156,13 @@ def bootstrap_pex(entry_point):
   pex.PEX(entry_point).execute()
 
 
+# NB: This helper is used by third party libs - namely https://github.com/wickman/lambdex.
+# TODO(John Sirois): Kill once https://github.com/wickman/lambdex/issues/5 is resolved.
+def is_compressed(entry_point):
+  from .pex_info import PexInfo
+  return os.path.exists(entry_point) and not os.path.exists(os.path.join(entry_point, PexInfo.PATH))
+
+
 def bootstrap_pex_env(entry_point):
   """Bootstrap the current runtime environment using a given pex."""
   pex_info = _bootstrap(entry_point)


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.4
On the docket:
+ [x] Restore pex.pex_bootstrapper.is_compressed API #684
+ [ ] Release more flexible pex binaries. #654
  + [x] If an `--interpreter-constraint` is set, it should always be honored. #656


Discussion:
I've short-cycled this in the interests of getting https://github.com/pantsbuild/pants/pull/7186 green - outstanding docket items moved to release 1.6.5 tracked in #690.

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__ = '1.6.3'
+__version__ = '1.6.4'


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.5
On the docket:
+ [x] pex does not resolve abi3 wheels correctly #539



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__ = '1.6.4'
+__version__ = '1.6.5'


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.6
On the docket:
+ [x] Release more flexible pex binaries. #654
+ [x] If sys.executable is not on PATH a pex will re-exec itself forever. #700


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__ = '1.6.5'
+__version__ = '1.6.6'


Test patch:
Repository: pex-tool/pex

Issue:
Add timeout support when fetching requirements.
It would be useful if pex allowed for a configurable timeout when downloading requirements.



Discussion:

Resolving patch:
diff --git a/pex/http.py b/pex/http.py
--- a/pex/http.py
+++ b/pex/http.py
@@ -231,6 +231,7 @@ def __init__(self, session=None, verify=True, env=ENV):
       raise ValueError('max_retries may not be negative.')
 
     self._max_retries = max_retries
+    self._timeout = env.PEX_HTTP_TIMEOUT
     self._session = session or self._create_session(self._max_retries)
 
   def open(self, link):
@@ -240,7 +241,8 @@ def open(self, link):
     for attempt in range(self._max_retries + 1):
       try:
         return StreamFilelike(self._session.get(
-            link.url, verify=self._verify, stream=True, headers={'User-Agent': self.USER_AGENT}),
+            link.url, verify=self._verify, stream=True, headers={'User-Agent': self.USER_AGENT},
+            timeout=self._timeout),
             link)
       except requests.exceptions.ReadTimeout:
         # Connect timeouts are handled by the HTTPAdapter, unfortunately read timeouts are not
@@ -267,7 +269,7 @@ def content(self, link):
   def resolve(self, link):
     return link.wrap(self._session.head(
         link.url, verify=self._verify, allow_redirects=True,
-        headers={'User-Agent': self.USER_AGENT}
+        headers={'User-Agent': self.USER_AGENT}, timeout=self._timeout
     ).url)
 
 
diff --git a/pex/variables.py b/pex/variables.py
--- a/pex/variables.py
+++ b/pex/variables.py
@@ -309,7 +309,7 @@ def PEX_VERBOSE(self):
     """
     return self._get_int('PEX_VERBOSE', default=0)
 
-  # TODO(wickman) Remove and push into --flags.  #94
+  # TODO(#94) Remove and push into --flags.
   @property
   def PEX_HTTP_RETRIES(self):
     """Integer
@@ -319,6 +319,18 @@ def PEX_HTTP_RETRIES(self):
     """
     return self._get_int('PEX_HTTP_RETRIES', default=5)
 
+  # TODO(#94) Remove and push into --flags.
+  @property
+  def PEX_HTTP_TIMEOUT(self):
+    """Integer
+
+    When built with the `requests` HTTP library, a timeout to apply for HTTP connect attempts and
+    read attempts. See the `requests` docs (https://2.python-requests.org/en/master/user/quickstart/#timeouts)
+    for more information.
+    Default: 15.
+    """
+    return self._get_int('PEX_HTTP_TIMEOUT', default=15)
+
   @property
   def PEX_IGNORE_RCFILES(self):
     """Boolean


Test patch:
diff --git a/tests/test_http.py b/tests/test_http.py
--- a/tests/test_http.py
+++ b/tests/test_http.py
@@ -146,6 +146,13 @@ def test_requests_context_retries_from_environment():
   assert RequestsContext(verify=False, env=env)._max_retries == int(retry_count)
 
 
+@pytest.mark.skipif(NO_REQUESTS)
+def test_requests_context_timeout_from_environment():
+  timeout = '42'
+  env = Variables({'PEX_HTTP_TIMEOUT': timeout})
+  assert RequestsContext(verify=False, env=env)._timeout == int(timeout)
+
+
 def timeout_side_effect(timeout_error=None, num_timeouts=1):
   timeout_error = timeout_error or requests.packages.urllib3.exceptions.ConnectTimeoutError
   url = 'http://pypi.org/foo.tar.gz'
Repository: pex-tool/pex

Issue:
Release 1.6.8
On the docket:

+ [x] Fixup pex re-exec during bootstrap. #741 
  + [x] Pex should not re-exec when the current interpreter satifies constraints #709
  + [x] Pex should not lose PEX_PYTHON or PEX_PYTHON_PATH when re-exec-ing #710
+ [x] Fix resolution of `setup.py` project extras. #739

Deferred:

+ [ ] Remove PEX_HTTP_RETRIES and push into a flag for the pex tool #94
+ [ ] Sdist resolution is not always reproducible #735


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__ = '1.6.7'
+__version__ = '1.6.8'


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.9
On the docket:
+ [x] Fix pkg resource early import #750
+ [x] Fix `sys.path` scrubbing of pex extras modules. #752

Maybe on the docket:
+ [ ] Problem running PEX files with restricted permissions #746


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__ = '1.6.8'
+__version__ = '1.6.9'


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.10
On the docket:

+ [x] version 1.6.9 fails with null module __file__ attribute #756 


Discussion:
This will be a hotfix release with just #756.

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__ = '1.6.9'
+__version__ = '1.6.10'


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.11
On the docket:
+ [x] Include `PYTHONPATH` in `--inherit-path` logic. #765
+ [x] Avoid reordering of equivalent packages from multiple fetchers #762


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__ = '1.6.10'
+__version__ = '1.6.11'


Test patch:
Repository: pex-tool/pex

Issue:
Release 1.6.12
On the docket:
+ [x] PythonInterpreter: support python binary names with single letter suffixes #769
+ [x] Pex should support some form of verifiably reproducible resolve. #772


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__ = '1.6.11'
+__version__ = '1.6.12'


Test patch: