internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: pypa/pip

Issue:
pip version 7.0.3 translates pytz version from 2009r to 2009.post0
pytz uses a version number scheme of <year><letter>, this previously worked with older versions of pip. With version 7.0.3 parse_version seems to translate `2009r` into `2009.post0`, this means you can't do a `pip install pytz==2009r`.



Discussion:
This seems to have been occurring from version `6.0.1` - version `1.5.2` is the latest version able to install this version of pytz.


Resolving patch:
diff --git a/pip/_vendor/packaging/__about__.py b/pip/_vendor/packaging/__about__.py
--- a/pip/_vendor/packaging/__about__.py
+++ b/pip/_vendor/packaging/__about__.py
@@ -22,7 +22,7 @@
 __summary__ = "Core utilities for Python packages"
 __uri__ = "https://github.com/pypa/packaging"
 
-__version__ = "15.2"
+__version__ = "15.3"
 
 __author__ = "Donald Stufft"
 __email__ = "donald@stufft.io"
diff --git a/pip/_vendor/packaging/version.py b/pip/_vendor/packaging/version.py
--- a/pip/_vendor/packaging/version.py
+++ b/pip/_vendor/packaging/version.py
@@ -324,6 +324,8 @@ def _parse_letter_version(letter, number):
             letter = "b"
         elif letter in ["c", "pre", "preview"]:
             letter = "rc"
+        elif letter in ["rev", "r"]:
+            letter = "post"
 
         return letter, int(number)
     if not letter and number:


Test patch:
Repository: pypa/pip

Issue:
Verbose log should mention that the installation is using a cached wheel
I was working on the final details of the coverage 4.0b1 kit, and had to tweak things.  This meant trying to install 4.0b1 a number of times, but with different contents and the same version number.  This baffled me because pip was using cached wheels, and I didn't know it.

I tried using -vvv to see what was going on, but it never mentioned the wheel cache, and I couldn't figure out why it wasn't compiling my C extension.

I totally understand pip's belief that the same version number means it can use a cached version. I'm fine with having to delete wheels from the cache myself in this scenario.  But the log should add some details about what's happening.



Discussion:

Resolving patch:
diff --git a/pip/req/req_install.py b/pip/req/req_install.py
--- a/pip/req/req_install.py
+++ b/pip/req/req_install.py
@@ -260,6 +260,8 @@ def link(self, link):
             self._link = link
         else:
             self._link = self._wheel_cache.cached_wheel(link, self.name)
+            if self._link != link:
+                logger.debug('Using cached wheel link: %s', self._link)
 
     @property
     def specifier(self):


Test patch:
Repository: pypa/pip

Issue:
--pre not recognized in requirements.txt



Discussion:

Resolving patch:
diff --git a/pip/cmdoptions.py b/pip/cmdoptions.py
--- a/pip/cmdoptions.py
+++ b/pip/cmdoptions.py
@@ -496,6 +496,14 @@ def only_binary():
     default=False,
     help="Don't clean up build directories.")
 
+pre = partial(
+    Option,
+    '--pre',
+    action='store_true',
+    default=False,
+    help="Include pre-release and development versions. By default, "
+         "pip only finds stable versions.")
+
 disable_pip_version_check = partial(
     Option,
     "--disable-pip-version-check",
diff --git a/pip/commands/install.py b/pip/commands/install.py
--- a/pip/commands/install.py
+++ b/pip/commands/install.py
@@ -156,13 +156,7 @@ def __init__(self, *args, **kw):
         cmd_opts.add_option(cmdoptions.no_use_wheel())
         cmd_opts.add_option(cmdoptions.no_binary())
         cmd_opts.add_option(cmdoptions.only_binary())
-
-        cmd_opts.add_option(
-            '--pre',
-            action='store_true',
-            default=False,
-            help="Include pre-release and development versions. By default, "
-                 "pip only finds stable versions.")
+        cmd_opts.add_option(cmdoptions.pre())
 
         cmd_opts.add_option(cmdoptions.no_clean())
 
diff --git a/pip/req/req_file.py b/pip/req/req_file.py
--- a/pip/req/req_file.py
+++ b/pip/req/req_file.py
@@ -43,6 +43,7 @@
     cmdoptions.always_unzip,
     cmdoptions.no_binary,
     cmdoptions.only_binary,
+    cmdoptions.pre,
     cmdoptions.process_dependency_links,
     cmdoptions.trusted_host,
 ]
@@ -220,6 +221,8 @@ def process_line(line, filename, line_number, finder=None, comes_from=None,
             if os.path.exists(relative_to_reqs_file):
                 value = relative_to_reqs_file
             finder.find_links.append(value)
+        if opts.pre:
+            finder.allow_all_prereleases = True
         if opts.process_dependency_links:
             finder.process_dependency_links = True
         if opts.trusted_hosts:


Test patch:
diff --git a/tests/unit/test_req_file.py b/tests/unit/test_req_file.py
--- a/tests/unit/test_req_file.py
+++ b/tests/unit/test_req_file.py
@@ -214,6 +214,10 @@ def test_noop_finder_no_allow_unsafe(self, finder):
         # noop, but confirm it can be set
         list(process_line("--no-allow-insecure", "file", 1, finder=finder))
 
+    def test_set_finder_allow_all_prereleases(self, finder):
+        list(process_line("--pre", "file", 1, finder=finder))
+        assert finder.allow_all_prereleases
+
     def test_relative_local_find_links(self, finder, monkeypatch):
         """
         Test a relative find_links path is joined with the req file directory
Repository: pypa/pip

Issue:
--process-dependency-links not recognized in requirements.txt



Discussion:

Resolving patch:
diff --git a/pip/req/req_file.py b/pip/req/req_file.py
--- a/pip/req/req_file.py
+++ b/pip/req/req_file.py
@@ -43,6 +43,7 @@
     cmdoptions.always_unzip,
     cmdoptions.no_binary,
     cmdoptions.only_binary,
+    cmdoptions.process_dependency_links,
     cmdoptions.trusted_host,
 ]
 
@@ -219,6 +220,8 @@ def process_line(line, filename, line_number, finder=None, comes_from=None,
             if os.path.exists(relative_to_reqs_file):
                 value = relative_to_reqs_file
             finder.find_links.append(value)
+        if opts.process_dependency_links:
+            finder.process_dependency_links = True
         if opts.trusted_hosts:
             finder.secure_origins.extend(
                 ("*", host, "*") for host in opts.trusted_hosts)


Test patch:
diff --git a/tests/unit/test_req_file.py b/tests/unit/test_req_file.py
--- a/tests/unit/test_req_file.py
+++ b/tests/unit/test_req_file.py
@@ -293,6 +293,11 @@ def parse(*args, **kwargs):
         call = mock_parse.mock_calls[0]
         assert call[1][0] == 'http://me.com/me/reqs.txt'
 
+    def test_set_finder_process_dependency_links(self, finder):
+        list(process_line(
+            "--process-dependency-links", "file", 1, finder=finder))
+        assert finder.process_dependency_links
+
 
 class TestBreakOptionsArgs(object):
Repository: pypa/pip

Issue:
'freeze' and SVN 1.7/1.8 exception and fix
I'm running pip 1.3.1 and despite the #369 fix it is still unable to run 'pip freeze' with SVN 1.7 or 1.8.

My SVN check-outs do not contain a ".svn/entries" file and it fails on this before getting to the fix from #369.

I have a quick fix (of sorts), below.

First, the exception:

```
# pip freeze
Exception:
Traceback (most recent call last):
  File "pip/basecommand.py", line 139, in main
    status = self.run(options, args)
  File "pip/commands/freeze.py", line 73, in run
    req = pip.FrozenRequirement.from_dist(dist, dependency_links, find_tags=find_tags)
  File "pip/__init__.py", line 181, in from_dist
    req = get_src_requirement(dist, location, find_tags)
  File "pip/vcs/__init__.py", line 249, in get_src_requirement
    return version_control().get_src_requirement(dist, location, find_tags)
  File "pip/vcs/subversion.py", line 213, in get_src_requirement
    repo = self.get_url(location)
  File "pip/vcs/subversion.py", line 156, in get_url
    return self._get_svn_url_rev(location)[0]
  File "pip/vcs/subversion.py", line 159, in _get_svn_url_rev
    f = open(os.path.join(location, self.dirname, 'entries'))

IOError: [Errno 2] No such file or directory: 'xmlbuilder/.svn/entries'

Storing complete log in /root/.pip/pip.log
```

The contents of .svn (SVN itself appears to be working fine).

```
# ls xmlbuilder/.svn/
pristine  tmp  wc.db
```

My SVN checkouts are all 'svn upgrade'd from SVN 1.6 to 1.7 to 1.8.

Excuse the quick hack, but this is enough to get it working:

```
# diff pip/vcs/subversion.py.back pip/vcs/subversion.py
159,161c159,164
<         f = open(os.path.join(location, self.dirname, 'entries'))
<         data = f.read()
<         f.close()

---
>         try:
>             f = open(os.path.join(location, self.dirname, 'entries'))
>             data = f.read()
>             f.close()
>         except:
>             data = "SVN >=1.7"
```

This allows the IOError to pass, and the #369 fix kicks into action because the contents of 'data' can't be parsed as SVN <= 1.6.



Discussion:

Resolving patch:
diff --git a/pip/vcs/subversion.py b/pip/vcs/subversion.py
--- a/pip/vcs/subversion.py
+++ b/pip/vcs/subversion.py
@@ -163,8 +163,13 @@ def get_url(self, location):
     def _get_svn_url_rev(self, location):
         from pip.exceptions import InstallationError
 
-        with open(os.path.join(location, self.dirname, 'entries')) as f:
-            data = f.read()
+        entries_path = os.path.join(location, self.dirname, 'entries')
+        if os.path.exists(entries_path):
+            with open(entries_path) as f:
+                data = f.read()
+        else:  # subversion >= 1.7 does not have the 'entries' file
+            data = ''
+
         if (data.startswith('8') or
                 data.startswith('9') or
                 data.startswith('10')):


Test patch:
Repository: pypa/pip

Issue:
Take certificate bundle hints from ssl.get_default_verify_paths()
To find a root certificate bundle to use to verify TLS certificates, pip looks in a hard-coded list of locations: https://github.com/pypa/pip/blob/40242fe4db24d14362937c10e77fd95dfd97f3c9/pip/locations.py#L18-L36

This can lead to surprising failures if a stale certificate bundle is errantly placed in the search list: Homebrew/homebrew#41253

@dstufft suggests using `ssl.get_default_verify_paths()` to learn where to look for a CA bundle instead of relying on a hard-coded search list (and falling back to pip's vendored CA bundle if that file doesn't exist or the API is unavailable).



Discussion:

Resolving patch:
diff --git a/pip/locations.py b/pip/locations.py
--- a/pip/locations.py
+++ b/pip/locations.py
@@ -4,6 +4,7 @@
 import os
 import os.path
 import site
+import ssl
 import sys
 
 from distutils import sysconfig
@@ -13,36 +14,15 @@
 from pip.utils import appdirs
 
 
-# CA Bundle Locations
-CA_BUNDLE_PATHS = [
-    # Debian/Ubuntu/Gentoo etc.
-    "/etc/ssl/certs/ca-certificates.crt",
-
-    # Fedora/RHEL
-    "/etc/pki/tls/certs/ca-bundle.crt",
-
-    # OpenSUSE
-    "/etc/ssl/ca-bundle.pem",
-
-    # OpenBSD
-    "/etc/ssl/cert.pem",
-
-    # FreeBSD/DragonFly
-    "/usr/local/share/certs/ca-root-nss.crt",
-
-    # Homebrew on OSX
-    "/usr/local/etc/openssl/cert.pem",
-]
-
-# Attempt to locate a CA Bundle that we can pass into requests, we have a list
-# of possible ones from various systems. If we cannot find one then we'll set
-# this to None so that we default to whatever requests is setup to handle.
-#
-# Note to Downstream: If you wish to disable this autodetection and simply use
-#                     whatever requests does (likely you've already patched
-#                     requests.certs.where()) then simply edit this line so
-#                     that it reads ``CA_BUNDLE_PATH = None``.
-CA_BUNDLE_PATH = next((x for x in CA_BUNDLE_PATHS if os.path.exists(x)), None)
+# if the Python we're running on is new enough to have the needed API then
+# we'll ask OpenSSL to give us the path to the default CA Bundle. If this API
+# doesn't exist or we cannot resolve the path to an existing file, then we will
+# simply set this to None. Setting this to None will have requests fall back
+# and use it's default CA Bundle logic.
+if getattr(ssl, "get_default_verify_paths", None):
+    CA_BUNDLE_PATH = ssl.get_default_verify_paths().cafile
+else:
+    CA_BUNDLE_PATH = None
 
 
 # Application Directories


Test patch:
Repository: pypa/pip

Issue:
pip 8.0 returns pre-release files for pip list -o without --pre
When running `pip list -o` pip 8.0 is listing pre-release files even though previously it did not. I suspect that this might be because of some of the refactors done by @xavfernandez.



Discussion:
Example:

``` console
$ pip install html5lib
Collecting html5lib
Collecting six (from html5lib)
  Using cached six-1.10.0-py2.py3-none-any.whl
Installing collected packages: six, html5lib
Successfully installed html5lib-0.9999999 six-1.10.0
$ pip list -o
html5lib (0.9999999) - Latest: 1.0b8 [sdist]
```

Guilty, I'll fix it today

I think it's also likely we lost the code that only accepted new versions that are actually supported on the target OS and maybe support for `--binary-only` and `--no-binary`.

> I think it's also likely we lost the code that only accepted new versions that are actually supported on the target OS and maybe support for --binary-only and --no-binary.

These ones should still be good.


Resolving patch:
diff --git a/pip/commands/list.py b/pip/commands/list.py
--- a/pip/commands/list.py
+++ b/pip/commands/list.py
@@ -159,6 +159,11 @@ def find_packages_latest_versions(self, options):
             for dist in installed_packages:
                 typ = 'unknown'
                 all_candidates = finder.find_all_candidates(dist.key)
+                if not options.pre:
+                    # Remove prereleases
+                    all_candidates = [candidate for candidate in all_candidates
+                                      if not candidate.version.is_prerelease]
+
                 if not all_candidates:
                     continue
                 best_candidate = max(all_candidates,


Test patch:
diff --git a/tests/functional/test_list.py b/tests/functional/test_list.py
--- a/tests/functional/test_list.py
+++ b/tests/functional/test_list.py
@@ -147,3 +147,22 @@ def test_outdated_editables_flag(script, data):
     assert os.path.join('src', 'pip-test-package') in result.stdout, (
         str(result)
     )
+
+
+def test_outdated_pre(script, data):
+    script.pip('install', '-f', data.find_links, '--no-index', 'simple==1.0')
+
+    # Let's build a fake wheelhouse
+    script.scratch_path.join("wheelhouse").mkdir()
+    wheelhouse_path = script.scratch_path / 'wheelhouse'
+    wheelhouse_path.join('simple-1.1-py2.py3-none-any.whl').write('')
+    wheelhouse_path.join('simple-2.0.dev0-py2.py3-none-any.whl').write('')
+    result = script.pip('list', '--no-index', '--find-links', wheelhouse_path)
+    assert 'simple (1.0)' in result.stdout
+    result = script.pip('list', '--no-index', '--find-links', wheelhouse_path,
+                        '--outdated')
+    assert 'simple (1.0) - Latest: 1.1 [wheel]' in result.stdout
+    result_pre = script.pip('list', '--no-index',
+                            '--find-links', wheelhouse_path,
+                            '--outdated', '--pre')
+    assert 'simple (1.0) - Latest: 2.0.dev0 [wheel]' in result_pre.stdout
Repository: pypa/pip

Issue:
Error when call_subprocess fails with show_stdout=True
If `call_subprocess` in `utils/__init__.py` is called with `show_stdout=True`, and the subprocess fails, pip errors out with `UnboundLocalError: local variable 'all_output' referenced before assignment`.

To avoid this, it should not try to print `all_output` when called when `show_stdout=True`. In this case, the process's stdout will already be printed to the console.

Discovered using this command:

```
$ pip install git+ssh://git@github.com:uber/vertica-python.git@0.2.1
Collecting git+ssh://git@github.com:uber/vertica-python.git@0.2.1
  Cloning ssh://git@github.com:uber/vertica-python.git (to 0.2.1) to /tmp/pip-8k63_T-build
ssh: Could not resolve hostname github.com:uber: Name or service not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
git clone -q ssh://git@github.com:uber/vertica-python.git /tmp/pip-8k63_T-build
  Complete output from command git clone -q ssh://git@github.com:uber/vertica-python.git /tmp/pip-8k63_T-build:
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/site-packages/pip/commands/install.py", line 299, in run
    requirement_set.prepare_files(finder)
  File "/usr/lib/python2.7/site-packages/pip/req/req_set.py", line 359, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python2.7/site-packages/pip/req/req_set.py", line 576, in _prepare_file
    session=self.session, hashes=hashes)
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 793, in unpack_url
    unpack_vcs_link(link, location)
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 474, in unpack_vcs_link
    vcs_backend.unpack(location)
  File "/usr/lib/python2.7/site-packages/pip/vcs/__init__.py", line 283, in unpack
    self.obtain(location)
  File "/usr/lib/python2.7/site-packages/pip/vcs/git.py", line 124, in obtain
    self.run_command(['clone', '-q', url, dest])
  File "/usr/lib/python2.7/site-packages/pip/vcs/__init__.py", line 322, in run_command
    spinner)
  File "/usr/lib/python2.7/site-packages/pip/utils/__init__.py", line 712, in call_subprocess
    ''.join(all_output) +
UnboundLocalError: local variable 'all_output' referenced before assignment
```



Discussion:

Resolving patch:
diff --git a/pip/utils/__init__.py b/pip/utils/__init__.py
--- a/pip/utils/__init__.py
+++ b/pip/utils/__init__.py
@@ -703,7 +703,8 @@ def call_subprocess(cmd, show_stdout=True, cwd=None,
             spinner.finish("done")
     if proc.returncode:
         if on_returncode == 'raise':
-            if logger.getEffectiveLevel() > std_logging.DEBUG:
+            if (logger.getEffectiveLevel() > std_logging.DEBUG and
+                    not show_stdout):
                 logger.info(
                     'Complete output from command %s:', command_desc,
                 )


Test patch:
Repository: pypa/pip

Issue:
Invalid package name argument to `pip install` can output an IndexError
`pip install -e git+` will yield:

```
Traceback (most recent call last):
  File "/PATH/site-packages/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/PATH/site-packages/pip/commands/install.py", line 287, in run
    wheel_cache
  File "/PATH/site-packages/pip/basecommand.py", line 280, in populate_requirement_set
    wheel_cache=wheel_cache
  File "/PATH/site-packages/pip/req/req_install.py", line 139, in from_editable
    editable_req, default_vcs)
  File "/PATH/site-packages/pip/req/req_install.py", line 1207, in parse_editable
    req = _build_req_from_url(editable_req)
  File "/PATH/site-packages/pip/req/req_install.py", line 1103, in _build_req_from_url
    if parts[-2] in ('tags', 'branches', 'tag', 'branch'):
IndexError: list index out of range
```

I'd _meant_ to paste the URL, but it turns out I pasted a newline. Go me. 
I assume there needs to be a guard on the length of `parts` before seeking the value.

```
> pip -V
pip 8.0.3 from /PATH/site-packages  (python 2.7)
```



Discussion:

Resolving patch:
diff --git a/pip/req/req_install.py b/pip/req/req_install.py
--- a/pip/req/req_install.py
+++ b/pip/req/req_install.py
@@ -1090,9 +1090,9 @@ def _build_req_from_url(url):
     parts = [p for p in url.split('#', 1)[0].split('/') if p]
 
     req = None
-    if parts[-2] in ('tags', 'branches', 'tag', 'branch'):
+    if len(parts) > 2 and parts[-2] in ('tags', 'branches', 'tag', 'branch'):
         req = parts[-3]
-    elif parts[-1] == 'trunk':
+    elif len(parts) > 1 and parts[-1] == 'trunk':
         req = parts[-2]
     if req:
         warnings.warn(


Test patch:
Repository: pypa/pip

Issue:
Show INSTALLER from PEP376 in pip show
Now that #1646 is implemented, it would interesting to show this information in `pip show`.



Discussion:

Resolving patch:
diff --git a/pip/commands/show.py b/pip/commands/show.py
--- a/pip/commands/show.py
+++ b/pip/commands/show.py
@@ -85,6 +85,14 @@ def search_packages_info(query):
             entry_points = dist.get_metadata_lines('entry_points.txt')
             package['entry_points'] = entry_points
 
+        installer = None
+        if dist.has_metadata('INSTALLER'):
+            for line in dist.get_metadata_lines('INSTALLER'):
+                if line.strip():
+                    installer = line.strip()
+                    break
+        package['installer'] = installer
+
         # @todo: Should pkg_resources.Distribution have a
         # `get_pkg_info` method?
         feed_parser = FeedParser()
@@ -124,6 +132,8 @@ def print_results(distributions, list_all_files):
         logger.info("Home-page: %s", dist.get('home-page'))
         logger.info("Author: %s", dist.get('author'))
         logger.info("Author-email: %s", dist.get('author-email'))
+        if dist['installer'] is not None:
+            logger.info("Installer: %s", dist['installer'])
         logger.info("License: %s", dist.get('license'))
         logger.info("Location: %s", dist['location'])
         logger.info("Requires: %s", ', '.join(dist['requires']))


Test patch:
diff --git a/tests/functional/test_show.py b/tests/functional/test_show.py
--- a/tests/functional/test_show.py
+++ b/tests/functional/test_show.py
@@ -107,3 +107,15 @@ def test_show_with_classifiers(script, data):
     assert 'Name: pip' in lines
     assert re.search(r"Classifiers:\n(  .+\n)+", result.stdout)
     assert "Intended Audience :: Developers" in result.stdout
+
+
+def test_show_installer(script, data):
+    """
+    Test that the installer is shown (this currently needs a wheel install)
+    """
+    wheel_file = data.packages.join('simple.dist-0.1-py2.py3-none-any.whl')
+    script.pip('install', '--no-index', wheel_file)
+    result = script.pip('show', 'simple.dist')
+    lines = result.stdout.split('\n')
+    assert 'Name: simple.dist' in lines
+    assert 'Installer: pip' in lines
Repository: pypa/pip

Issue:
Wrong supported_tags generation
Initially spotted in #3438.

According to https://www.python.org/dev/peps/pep-0425/#id1 example for cp33 seems to be compatible with py32 but not cp32.
But currently on pip 8.0.2 and python3.4, we are getting:

```
>>> from pip.pep425tags import supported_tags
>>> supported_tags
[('cp34', 'cp34m', 'linux_x86_64'), ('cp34', 'abi3', 'linux_x86_64'),
('cp34', 'none', 'linux_x86_64'), ('py3', 'none', 'linux_x86_64'),
('cp34', 'none', 'any'), ('cp3', 'none', 'any'), ('cp33', 'none', 'any'),
('cp32', 'none', 'any'), ('cp31', 'none', 'any'), ('cp30', 'none', 'any'),
('py34', 'none', 'any'), ('py3', 'none', 'any'), ('py33', 'none', 'any'),
('py32', 'none', 'any'), ('py31', 'none', 'any'),
('py30', 'none', 'any')]
```

The `pip.pep425tags` module should likely be moved to `packaging`.



Discussion:

Resolving patch:
diff --git a/pip/pep425tags.py b/pip/pep425tags.py
--- a/pip/pep425tags.py
+++ b/pip/pep425tags.py
@@ -256,12 +256,10 @@ def get_supported(versions=None, noarch=False):
             supported.append(('py%s' % (versions[0][0]), 'none', arch))
 
     # No abi / arch, but requires our implementation:
-    for i, version in enumerate(versions):
-        supported.append(('%s%s' % (impl, version), 'none', 'any'))
-        if i == 0:
-            # Tagged specifically as being cross-version compatible
-            # (with just the major version specified)
-            supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))
+    supported.append(('%s%s' % (impl, versions[0]), 'none', 'any'))
+    # Tagged specifically as being cross-version compatible
+    # (with just the major version specified)
+    supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))
 
     # No abi / arch, generic Python
     for i, version in enumerate(versions):


Test patch: