New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port backend/jvm #6092

Merged
merged 25 commits into from Jul 22, 2018

Conversation

Projects
None yet
5 participants
@Eric-Arellano
Copy link
Contributor

Eric-Arellano commented Jul 10, 2018

Part of #6062

Let me know if this is too big, I can break it up into a PR porting tests and another the src code. I'll flag anything worth reviewing - most changes are automatic or fairly trivial conversions from list(filter(...)) to a list comp/generator.

def __ne__(self, other):
return not self == other
# TODO(python3port): Return NotImplemented if other does not have attributes
def __lt__(self, other):

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 10, 2018

Contributor

Replaced __cmp__ with rich comparisons, which are auto-generated from the @total_ordering annotation.

Same semantics as before

@@ -255,7 +256,7 @@ def __iter__(self):
def __len__(self):
return len(self._artifacts_to_versions)

def __nonzero__(self):
def __bool__(self):

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 10, 2018

Contributor

from builtins import object means that this will implement __nonzero__ for us if Py2

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 15, 2018

Contributor

I found through porting another module that this automatic implementation of __nonzero__ only holds if the class inherits the backported object. If it inherits another class, then there will be no __nonzero__ implementation.

I think it’s likely safe to assume this won’t be subclassesed by something other than object anytime soon, but I can remove this deletion if we prefer to use the more explicit implementation of both __bool__ and __nonzero__.

@@ -231,15 +234,13 @@ def __iter__(self):
def __eq__(self, other):
return tuple(self) == tuple(other)

def __ne__(self, other):
return not self.__eq__(other)
# TODO(python3port): decide if this should raise NotImplemented on invalid comparisons

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 10, 2018

Contributor

Ditto on replacing __cmp__ with rich comparisons

Same semantics as before

@@ -434,7 +435,8 @@ def _filter_by_excludes(self, classpath_target_tuples, root_targets):
# set of targets was included here, their closure must be included.
closure = BuildGraph.closure(root_targets, bfs=True)
excludes = self._excludes.get_for_targets(closure)
return filter(_not_excluded_filter(excludes), classpath_target_tuples)
return [target_tuple for target_tuple in classpath_target_tuples

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 10, 2018

Contributor

This list comp is a little weird. _not_excluded_filter(excludes) returns a lambda, to which we pass the individual item target_tuple, hence the double parentheses.

I tested that it works (tests were failing until I got the logic right).

@@ -165,7 +166,7 @@ def write(self, target, path):

target_jar = self._internaldep(self._as_versioned_jar(target), target)
if target_jar:
target_jar = target_jar.extend(dependencies=dependencies.values())
target_jar = target_jar.extend(dependencies=list(dependencies.values()))

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 10, 2018

Contributor

Not sure if the call to list() is necessary. I think this is an override of extend()? Usually it doesn't allow for keyword args.

@@ -868,8 +869,10 @@ def get_synthetic(lang, target):
def exportable(tgt):
return tgt in candidates and self._is_exported(tgt)

return OrderedSet(filter(exportable,
reversed(sort_targets(filter(exportable, candidates)))))
return OrderedSet(target for target in

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 10, 2018

Contributor

This nested generator clause works, although is a little hard to read, as was the original.

I can refactor if you want, although might be better to keep original structure.

@@ -213,7 +214,7 @@ def create_dep_usage_nodes(self, targets, node_creator):
nodes[concrete_target] = node

# Prune any Nodes with 0 products.
for concrete_target, node in nodes.items()[:]:
for concrete_target, node in list(nodes.items()): # copy because mutation

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 10, 2018

Contributor

This was an unusual line to port. The slice was originally there to make a copy of the list. We can achieve the same effect by calling list()

I added the comment so people don't accidently remove list()

@stuhood

This comment has been minimized.

Copy link
Member

stuhood commented Jul 10, 2018

This should be fine size-wise, since you've been ramping up from smaller edits. Will review when CI is greenish.

@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 11, 2018

Thanks @stuhood!

I'm confused why the linter is failing on CI but not locally with pants/backend/jvm/tasks/jvm_compile/execution_graph.py? I called ./pants fmt and ./pants lint on it, along with isort.sh and pre-commit.sh, and all are green.

@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 11, 2018

One of the reasons CI is failing is issues with engine/fs.py. I'm going to try to port that folder first.

@cosmicexplorer

This comment has been minimized.

Copy link
Contributor

cosmicexplorer commented Jul 12, 2018

Did you call isort.sh -f, or just isort.sh? I have no particular reason to expect that the result would be different, just wondering.

stuhood added a commit that referenced this pull request Jul 14, 2018

Port engine/fs.py datatype() instances (#6103)
This applies the principles learned in #6098 to the `engine/fs.py` classes like `DirectoryToMaterialize`. Refer to that PR for an explanation of why this is necessary.

Will fix the broken test in #6092. Part of #6062

stuhood added a commit that referenced this pull request Jul 15, 2018

Fix test_objects handling of dataclass() py2-py3 compatibility (#6098)
Followup from #6072, which was an incorrect representation of the changes made to metaprogramming with Python 3 port. Part of #6062.

## Problem
`object.py`'s `datatype()` function expects exactly one type. This poses an issue when we add `from builtins import str` to files - in Py2, the type will become `newstr`, whereas in Py3 the type will become `str`. `type(newstr) != type(str)`, even though the behavior is similar, so `datatype()` will raise an exception.

We ran into this issue originally with `test_objects.py`. The original solution only fixed the tests, it didn't actually fix the underlying problem, which I realized when `engine/fs.py` starting breaking with PRs that touched it like the [`backend/jvm` port](#6092).

## Solution
The solution has two parts:
1) Wherever we define a class using the metaclass of `datatype`, set the parameter to `future.utils.text_type`, rather than `str`. This means in Py2 the type will be `unicode` and in Py3 the type will be `str`. Both have the same unicode semantics, which is a good thing.

```python
from future.utils import text_type

class Foo(datatype([('val', text_type)])): pass
```

2) When instantiating a class that uses `dataclass` as its metaclass, wrap the parameter calls with `text_type(x)`. This will call `unicode(x)` in Py2 and `str()` in Py3, resulting in the correct type for the class definition from the first step. 

```python
from future.utils import text_type

example = Foo(text_type('🐍'))
```

## What this impacts
Anywhere we create a class with `datatype()` that sets a parameter to `str`, we'll have to make this change to both the class definition and all of its instantiations. 

The biggest example of this is in `engine/fs.py`

Eric-Arellano added some commits Jul 15, 2018

Merge branch 'master' into port-backend-jvm
# Conflicts:
#	src/python/pants/backend/graph_info/tasks/cloc.py
#	src/python/pants/backend/jvm/subsystems/zinc_language_mixin.py
#	src/python/pants/backend/jvm/tasks/jvm_compile/javac/BUILD
#	src/python/pants/backend/jvm/tasks/jvm_compile/javac/javac_compile.py
#	src/python/pants/binaries/binary_tool.py
#	src/python/pants/engine/fs.py
#	src/python/pants/engine/native.py
#	src/rust/engine/src/externs.rs
#	tests/python/pants_test/engine/test_build_files.py
#	tests/python/pants_test/engine/test_fs.py
#	tests/python/pants_test/engine/test_isolated_process.py
Merge branch 'master' into port-backend-jvm
# Conflicts:
#	src/python/pants/backend/graph_info/tasks/cloc.py
#	src/python/pants/backend/jvm/subsystems/zinc_language_mixin.py
#	src/python/pants/backend/jvm/tasks/jvm_compile/javac/BUILD
#	src/python/pants/backend/jvm/tasks/jvm_compile/javac/javac_compile.py
#	src/python/pants/binaries/binary_tool.py
#	src/python/pants/engine/fs.py
#	src/python/pants/engine/native.py
#	src/rust/engine/src/externs.rs
#	tests/python/pants_test/engine/test_build_files.py
#	tests/python/pants_test/engine/test_fs.py
#	tests/python/pants_test/engine/test_isolated_process.py
@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 15, 2018

I'm really confused why CI is still saying backend/jvm/tasks/jvm_compile/execution_graph.py is not correctly sorted. isort.sh -f doesn't do anything.

I don't think a force merge makes sense, because I'm concerned that would break future PRs.

@cosmicexplorer

This comment has been minimized.

Copy link
Contributor

cosmicexplorer commented Jul 15, 2018

Running build-support/bin/isort.sh -f locally for me results in the following change:

diff --git a/src/python/pants/backend/jvm/tasks/jvm_compile/execution_graph.py b/src/python/pants/backend/jvm/tasks/jvm_compile/execution_graph.py
index 03d175700..813dc3294 100644
--- a/src/python/pants/backend/jvm/tasks/jvm_compile/execution_graph.py
+++ b/src/python/pants/backend/jvm/tasks/jvm_compile/execution_graph.py
@@ -4,13 +4,14 @@
 
 from __future__ import absolute_import, division, print_function, unicode_literals
 
-import queue
 import threading
 import traceback
 from builtins import map, object, str
 from collections import defaultdict, deque
 from heapq import heappop, heappush
 
+import queue
+
 from pants.base.worker_pool import Work

I'm not sure at all why it would run differently for you, which is really weird and I doubt it's your fault. I also have no clue why this would be "correct" since queue seems to be part of the python standard lib? One data point is that the python on my PATH points to python2, and I think homebrew (if you're on OSX using the homebrew toolchain) will set it to python3 by default? This is all supposition.

edit: Nope, changing it to python3 has the same result. I didn't think that would matter anyway.

@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 15, 2018

Hmm weird, that leads to an error on my computer. That's good to know you're getting different output though.

It probably isn't a good solution for us to choose one vs the other, because I'm concerned people will get an error when running isort.sh on their computer for this unrelated file if they happen to have the version of isort that errs out..

I think we'll need to figure out why we're getting the discrepancy.

--
Here are some details about my setup that may be relevant:

  • macos 13.4
  • which python -> /usr/local/bin/python, v 2.7.15
  • which python2 -> /usr/local/bin/python2, v 2.7.15
  • which python3 -> /usr/local/bin/python3, v 3.7.0

--

There was also a potential cause that $ which isort pointed to /usr/local/bin/isort, although $ isort would complain with zsh: /usr/local/bin/isort: bad interpreter: /usr/local/opt/python/bin/python3.6: no such file or directory.

I deleted /usr/local/bin/isort and am still getting the same behavior.

--

@jsirois any ideas of where to look for debugging this?

@stuhood

This comment has been minimized.

Copy link
Member

stuhood commented Jul 16, 2018

What happens when you directly run ~/.cache/pants/bin/isort/4.2.5/isort.pex on the file? ie:

~/.cache/pants/bin/isort/4.2.5/isort.pex src/python/pants/backend/jvm/tasks/jvm_compile/execution_graph.py
@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 16, 2018

@stuhood same behavior, that it doesn't match CI's version :/

I think the discrepancy results from CI's isort identifying queue as a 3rd party library provided by future, whereas my version identifies it as a Python3 builtin.

The question is where is that coming from..?

--

I tried removing the ~/.cache/pants and running ./pants clean-all to no avail

@jsirois

This comment has been minimized.

Copy link
Member

jsirois commented Jul 16, 2018

What's the isort.pex shebang? If python that's a problem. We probably want to republish with python2.7.

@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 16, 2018

$ head -1 ~/.cache/pants/bin/isort/4.2.5/isort.pex
#!/usr/bin/env python2.7

My computer's python2.7 is Python 2.7.15 installed by homebrew. I'm going to try running on Centos.

@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 16, 2018

I'm not able to install Pants on Centos6. It fails on ./pants (I can file an issue if you'd like with stack trace).

We today set up internal Travis testing at Foursquare for this porting project, so I'm going to try to iterate on this there.

Hypothesis I'm checking is this may be resulting from CI using Python2.7.13 and my mac using 2.7.15.

@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 16, 2018

@stuhood feel free to cancel this CI. I'm playing with Foursquare's CI and forgot this would push to Pants also.

@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 16, 2018

Hm, Python 2.7.13 vs Python 2.7.15 is not causing the discrepancy.

Let me know if you think of any other potential things to investigate. I'll keep thinking about this one 🤔

@jsirois

This comment has been minimized.

Copy link
Member

jsirois commented Jul 16, 2018

@Eric-Arellano re Cento6, if you still have the backtrace and you know it's not due to not complying with https://github.com/pantsbuild/pants#requirements, an issue would be great.

@@ -4,9 +4,10 @@

from __future__ import absolute_import, division, print_function, unicode_literals

import Queue as queue
import queue

This comment has been minimized.

@jsirois

jsirois Jul 17, 2018

Member

So, the interesting datapoint is:
https://github.com/timothycrosley/isort/blob/4.2.5/isort/settings.py#L53-L64

Modern isort has both queue and Queue:
https://github.com/timothycrosley/isort/blob/4.3.4/isort/settings.py#L58-L89

So this does look like an environment leak of some sort - which would be Pants fault. Digging a bit, but - for sanity sake - can you confirm .isort.cfg in your clone matches origin/master and is readable by the user you run ./pants as?

This comment has been minimized.

@jsirois

jsirois Jul 17, 2018

Member

Another sanity check - you should see this:

$ ./pants options --scope=isort
isort.version = 4.2.5 (from HARDCODED)

This comment has been minimized.

@jsirois

jsirois Jul 17, 2018

Member

Another sanity check. If you don't find something like this; ie: the isort import resolving inside the pex:

$ PEX_INTERPRETER=1 ~/.cache/pants/bin/isort/4.2.5/isort.pex
Python 2.7.15 (default, Jun 27 2018, 13:05:28) 
[GCC 8.1.1 20180531] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from isort import settings
>>> settings.__file__
'/home/jsirois/.pex/install/isort-4.2.5-py2.py3-none-any.whl.440f1368d2835debbb62deef09cb82e24bf351a2/isort-4.2.5-py2.py3-none-any.whl/isort/settings.pyc'
>>> 

Then report this:

$ PEX_VERBOSE=9 PEX_INTERPRETER=1 ~/.cache/pants/bin/isort/4.2.5/isort.pex
pex: Found site-library: /usr/lib/site-python
pex: Found site-library: /usr/lib/python2.7/site-packages
pex: Not a tainted path element: /home/jsirois/.cache/pants/bin/isort/4.2.5/isort.pex/.bootstrap
pex: Not a tainted path element: /home/jsirois/.cache/pants/bin/isort/4.2.5/isort.pex
pex: Not a tainted path element: /usr/lib/python27.zip
pex: Not a tainted path element: /usr/lib/python2.7
pex: Not a tainted path element: /usr/lib/python2.7/plat-linux2
pex: Not a tainted path element: /usr/lib/python2.7/lib-tk
pex: Not a tainted path element: /usr/lib/python2.7/lib-old
pex: Not a tainted path element: /usr/lib/python2.7/lib-dynload
pex: Tainted path element: /usr/lib/python2.7/site-packages
pex: Tainted path element: /usr/lib/python2.7/site-packages/gtk-2.0
pex: Scrubbing from user site: /home/jsirois/.local/lib/python2.7/site-packages
pex: Scrubbing from site-packages: /usr/lib/python2.7/site-packages
pex: Scrubbing from site-packages: /usr/lib/python2.7/site-packages/gtk-2.0
pex: Scrubbing from path_importer_cache: /usr/lib/python2.7/site-packages/gtk-2.0
pex: Scrubbing from path_importer_cache: /home/jsirois/.local/lib/python2.7/site-packages
pex: Scrubbing from path_importer_cache: /usr/lib/python2.7/site-packages
pex: Activating PEX virtual environment from /home/jsirois/.cache/pants/bin/isort/4.2.5/isort.pex: 11.2ms                                                                                                             
pex:   Searching dependency cache: /home/jsirois/.cache/pants/bin/isort/4.2.5/isort.pex/.deps: 2.1ms
pex:     Adding setuptools 5.4.1: 0.1ms
pex:     Adding isort 4.2.5: 0.1ms
pex:   Resolving isort==4.2.5: 6.4ms
pex:   Resolving setuptools==5.4.1: 2.1ms
pex:   Activating isort 4.2.5: 0.2ms
pex:     Adding sitedir: 0.1ms
pex:   Activating setuptools 5.4.1: 0.2ms
pex:     Adding sitedir: 0.1ms
pex: PYTHONPATH contains:
pex:   * /home/jsirois/.cache/pants/bin/isort/4.2.5/isort.pex/.bootstrap
pex:     /home/jsirois/.cache/pants/bin/isort/4.2.5/isort.pex
pex:   * /usr/lib/python27.zip
pex:     /usr/lib/python2.7
pex:     /usr/lib/python2.7/plat-linux2
pex:     /usr/lib/python2.7/lib-tk
pex:   * /usr/lib/python2.7/lib-old
pex:     /usr/lib/python2.7/lib-dynload
pex:     /home/jsirois/.pex/install/isort-4.2.5-py2.py3-none-any.whl.440f1368d2835debbb62deef09cb82e24bf351a2/isort-4.2.5-py2.py3-none-any.whl
pex:     /home/jsirois/.pex/install/setuptools-5.4.1-py2.py3-none-any.whl.77dd06420042734134bc9f929de0433f5c64ec67/setuptools-5.4.1-py2.py3-none-any.whl
pex:   * - paths that do not exist or will be imported via zipimport
pex: PEX_INTERPRETER specified, dropping into interpreter
Python 2.7.15 (default, Jun 27 2018, 13:05:28) 
[GCC 8.1.1 20180531] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

If you find there is no isort/__init__.py in any of the listings below pex: PYTHONPATH contains:.

This comment has been minimized.

@Eric-Arellano

Eric-Arellano Jul 17, 2018

Contributor

Thanks for looking into this John.

Results of sanity checks:

  • ./isort.cfg is the same. Not sure what you mean by it being accessible, but it has these permissions -rw-r--r--
  • ./pants options --scope=isort returns 4.2.5 as expected
  • settings.__file__ returns '/Users/earellano/.pex/install/isort-4.2.5-py2.py3-none-any.whl.440f1368d2835debbb62deef09cb82e24bf351a2/isort-4.2.5-py2.py3-none-any.whl/isort/settings.pyc'
  • looks like my PYTHONPATH contains is similar to yours:
pex: Found site-library: /usr/local/lib/python2.7/site-packages
pex: Found site-library: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/site-python
pex: Found site-library: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
pex: Not a tainted path element: /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex/.bootstrap
pex: Not a tainted path element: /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python27.zip
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old
pex: Not a tainted path element: /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload
pex: Tainted path element: /usr/local/lib/python2.7/site-packages
pex: Scrubbing from user site: /Users/earellano/Library/Python/2.7/lib/python/site-packages
pex: Scrubbing from site-packages: /usr/local/lib/python2.7/site-packages
pex: Scrubbing from path_importer_cache: /usr/local/lib/python2.7/site-packages
pex: Scrubbing from path_importer_cache: /Users/earellano/Library/Python/2.7/lib/python/site-packages
pex: Activating PEX virtual environment from /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex :: Searching dependency cache: /Users/earellano/.cache/pants/bpex: Activating PEX virtual environment from /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex :: Searching dependency cache: /Users/earellano/.cache/pants/bpex: Activating PEX virtual environment from /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex :: Searching dependency cache: /Users/earellano/.cache/pants/bpex: Activating PEX virtual environment from /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex :: Resolving isort==4.2.5                                     pex: Activating PEX virtual environment from /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex: 15.7ms
pex:   Searching dependency cache: /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex/.deps: 3.0ms
pex:     Adding setuptools 5.4.1: 0.2ms
pex:     Adding isort 4.2.5: 0.2ms
pex:   Resolving isort==4.2.5: 7.4ms
pex:   Resolving setuptools==5.4.1: 4.3ms
pex:   Activating isort 4.2.5: 0.4ms
pex:     Adding sitedir: 0.2ms
pex:   Activating setuptools 5.4.1: 0.3ms
pex:     Adding sitedir: 0.2ms
pex: PYTHONPATH contains:
pex:   * /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex/.bootstrap
pex:     /Users/earellano/.cache/pants/bin/isort/4.2.5/isort.pex
pex:   * /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python27.zip
pex:     /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7
pex:     /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
pex:     /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
pex:     /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
pex:     /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
pex:   * /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old
pex:     /usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload
pex:     /Users/earellano/.pex/install/isort-4.2.5-py2.py3-none-any.whl.440f1368d2835debbb62deef09cb82e24bf351a2/isort-4.2.5-py2.py3-none-any.whl
pex:     /Users/earellano/.pex/install/setuptools-5.4.1-py2.py3-none-any.whl.77dd06420042734134bc9f929de0433f5c64ec67/setuptools-5.4.1-py2.py3-none-any.whl
pex:   * - paths that do not exist or will be imported via zipimport
pex: PEX_INTERPRETER specified, dropping into interpreter
@Eric-Arellano

This comment has been minimized.

Copy link
Contributor

Eric-Arellano commented Jul 22, 2018

@jsirois this is ready to merge too. Thanks!

@jsirois jsirois merged commit 0ad7d95 into pantsbuild:master Jul 22, 2018

1 check passed

continuous-integration/travis-ci/pr The Travis CI build passed
Details

@Eric-Arellano Eric-Arellano deleted the Eric-Arellano:port-backend-jvm branch Jul 22, 2018

CMLivingston pushed a commit to CMLivingston/pants that referenced this pull request Aug 27, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment