[01:28:11] <lifeless> StevenK: without this patch I mean
[01:28:33] <StevenK> lifeless: Without that patch it will not fail either
[01:28:54] <lifeless> StevenK: I must be misunderstanding how the failure occurs
[01:29:24] <StevenK> lifeless: I'm in an IBM office with Jamie and Nakato today, so hangouts can't a thing
[01:29:24] <lifeless> StevenK: AIUI pass_markers is being called on a requirement line from the distribution metadata that has an extra guard implemented via markers
[01:30:27] <lifeless> StevenK: there is no *entry* for the distribution in the requires_markers dict, so the get returns (), and we then try the evaluate with no parameters
[01:31:50] <StevenK> lifeless: Yes, but calling it on foo[extra] where it depends on bar;extra=='extra' will parse the metadata, and populate the object correctly
[01:32:08] <StevenK> The problem is calling it on bar;extra=='extra' only
[01:48:14] <lifeless> StevenK: well, I htink it should be
[01:48:21] <lifeless> in the same way it evaluates version limits
[01:49:02] <StevenK> lifeless: So _prepare_file gets called for every requirement, which calls check_if_exists(), which calls into pkg_resources.get_distribution()
[01:49:15] <lifeless> StevenK: right, with you so far
[01:49:29] <StevenK> So foo[extra] -> bar;extra=='extra' works great
[01:49:44] <StevenK> But then it gets to bar;extra=='extra' and blows up
[01:49:44] <lifeless> StevenK: my specific point is that there should be -no way- to end up with str(self.req) -> foo;extra='extra'
[01:50:02] <lifeless> that str(self.req) is 100% broken if we're leaking that up
[01:51:17] <lifeless> StevenK: because of the special nature of extra in markers
[01:58:27] <lifeless> StevenK: remember that extra='something' in a marker means 'If the extra something has been requestsed in the distribution context *above* this one'
[01:59:01] <StevenK> Right, so we need to split out the marker in that case?
[01:59:03] <lifeless> StevenK: its entirely an internal detail used to reassemble the original dicts from setup()
[01:59:24] <lifeless> StevenK: so it should never ever leak out, or be accepted into, pkg_resources description of distributions
[02:00:06] <StevenK> Yes, I'm trying to sketch out in my head how that would work, and failing miserably
[02:01:27] <lifeless> StevenK: so lets focus on the specific issue
[02:01:39] <lifeless> StevenK: *how* is pip ending up with a str(req) that contains an extra marker
[02:03:10] <lifeless> StevenK: looks like self.req is a pkg_resources.Requirement.parse result
[02:09:22] <lifeless> StevenK: so since you have pip setup to break etc
[02:09:23] <StevenK> lifeless: req_set , line 339 or so
[02:09:45] <StevenK> discovered_reqs ends up including the extra marker
[02:09:47] <lifeless> StevenK: can you find out what self.req is at
[02:09:48] <lifeless> File "/tmp/pytest-14/test_extras_after_wheel0/workspace/venv/local/lib/python2.7/site-packages/pip-8.2.0.dev0-py2.7.egg/pip/req/req_install.py", line 996, in check_if_exists