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

pip install --upgrade stalls at the "uninstalling" phase #6169

Closed
wildlyinaccurate opened this Issue Jan 23, 2019 · 8 comments

Comments

Projects
None yet
6 participants
@wildlyinaccurate
Copy link

wildlyinaccurate commented Jan 23, 2019

Environment

  • pip version: 19.0
  • Python version: 2.7.15rc1
  • OS: Ubuntu 18.04.1 LTS (Kernel: 4.15.0-1031-aws)

Description

Running pip install --upgrade for any package that needs upgrading will cause pip to stall at the "Uninstalling" stage.

Expected behavior

Packages should be upgraded.

How to Reproduce

  1. On a system with cryptography-2.4.2 installed...
  2. Run pip install --upgrade cryptography
  3. Pip gets as far as Uninstalling cryptography-2.4.2 but doesn't go any further. -vvv does not provide any extra output.

Output

  Using version 2.5 (newest of versions: 0.1, 0.2, 0.2.1, 0.2.2, 0.3, 0.4, 0.5, 0.5.1, 0.5.2, 0.5.3, 0.5.4, 0.6, 0.6.1, 0.7, 0.7.1, 0.7.2, 0.8, 0.8.1, 0.8.2, 0.9, 0.9.1, 0.9.2, 0.9.3, 1.0, 1.0.1, 1.0.2, 1.1, 1.1.1, 1.1.2, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.3, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.4, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.6, 1.7, 1.7.1, 1.7.2, 1.8, 1.8.1, 1.8.2, 1.9, 2.0, 2.0.1, 2.0.2, 2.0.3, 2.1, 2.1.1, 2.1.2, 2.1.3, 2.1.4, 2.2, 2.2.1, 2.2.2, 2.3, 2.3.1, 2.4, 2.4.1, 2.4.2, 2.5)
  Created temporary directory: /tmp/pip-unpack-RPH06y
  Looking up "https://files.pythonhosted.org/packages/17/fd/4c2c8953a9dfe38fbe0c3adafb6355540bd98cef70cc82734acb0a4c0e2f/cryptography-2.5-cp27-cp27mu-manylinux1_x86_64.whl" in the cache
  Current age based on date: 5543
  Ignoring unknown cache-control directive: immutable
  Freshness lifetime from max-age: 365000000
  The response is "fresh", returning cached response
  365000000 > 5543
  Using cached https://files.pythonhosted.org/packages/17/fd/4c2c8953a9dfe38fbe0c3adafb6355540bd98cef70cc82734acb0a4c0e2f/cryptography-2.5-cp27-cp27mu-manylinux1_x86_64.whl
  Downloading from URL https://files.pythonhosted.org/packages/17/fd/4c2c8953a9dfe38fbe0c3adafb6355540bd98cef70cc82734acb0a4c0e2f/cryptography-2.5-cp27-cp27mu-manylinux1_x86_64.whl#sha256=42fad67d7072216a49e34f923d8cbda9edacbf6633b19a79655e88a1b4857063 (from https://pypi.org/simple/cryptography/) (requires-python:>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*)
  Added cryptography from https://files.pythonhosted.org/packages/17/fd/4c2c8953a9dfe38fbe0c3adafb6355540bd98cef70cc82734acb0a4c0e2f/cryptography-2.5-cp27-cp27mu-manylinux1_x86_64.whl#sha256=42fad67d7072216a49e34f923d8cbda9edacbf6633b19a79655e88a1b4857063 to build tracker '/tmp/pip-req-tracker-gljwal'
  Removed cryptography from https://files.pythonhosted.org/packages/17/fd/4c2c8953a9dfe38fbe0c3adafb6355540bd98cef70cc82734acb0a4c0e2f/cryptography-2.5-cp27-cp27mu-manylinux1_x86_64.whl#sha256=42fad67d7072216a49e34f923d8cbda9edacbf6633b19a79655e88a1b4857063 from build tracker '/tmp/pip-req-tracker-gljwal'
Requirement already satisfied, skipping upgrade: asn1crypto>=0.21.0 in /usr/lib/python2.7/dist-packages (from cryptography) (0.24.0)
Requirement already satisfied, skipping upgrade: enum34; python_version < "3" in /usr/lib/python2.7/dist-packages (from cryptography) (1.1.6)
Requirement already satisfied, skipping upgrade: ipaddress; python_version < "3" in /usr/local/lib/python2.7/dist-packages (from cryptography) (1.0.22)
Requirement already satisfied, skipping upgrade: cffi!=1.11.3,>=1.8 in /usr/local/lib/python2.7/dist-packages (from cryptography) (1.11.5)
Requirement already satisfied, skipping upgrade: six>=1.4.1 in /usr/lib/python2.7/dist-packages (from cryptography) (1.11.0)
Requirement already satisfied, skipping upgrade: pycparser in /usr/local/lib/python2.7/dist-packages (from cffi!=1.11.3,>=1.8->cryptography) (2.19)
Installing collected packages: cryptography
  Found existing installation: cryptography 2.4.2
    Uninstalling cryptography-2.4.2:

There is more output but it's mostly "Found link" and "Skipping link". Let me know if you need the full output.

wildlyinaccurate added a commit to wildlyinaccurate/wptagent that referenced this issue Jan 23, 2019

@pradyunsg pradyunsg added this to the 19.0 milestone Jan 23, 2019

@denis-bz

This comment has been minimized.

Copy link

denis-bz commented Jan 25, 2019

@wildlyinaccurate, when you interrupt the upgrade with ctl-C, what do you see in your site directory ?
I see e.g. /Library/Python/2.7/site-packages/-onfigparser-3.5.1.dist-info/, config -> -onfig ?!
However uninstall works fine.
(pip catches / turns off the stacktrace on so I can't tell where it's looping.)
My versions: Python 2.7, pip 19.0.0, macos 10.10

bryan-hunt added a commit to bryan-hunt/cryptoauthlib that referenced this issue Jan 25, 2019

@YannickJadoul

This comment has been minimized.

Copy link

YannickJadoul commented Jan 27, 2019

We're having the same problem over at the cibuildwheel project when running this on Travis: joerick/cibuildwheel#122

However, I think I've figured out what causes this:

It seems c7ae06c added a new way of generating temporary directories to copy uninstalled packages so that they can be rolled back if the new package's installation failed.

Notice the _generate_names method, generating potentially len(LEADING_CHARS)**len(name) (i.e., almost always a ridiculously enormous number) of temporary folder names. When the parent folder cannot be written to (because of permission issues, for example), the creation of these temporary folders will fail and the loop will go on checking all possibilities and never managing to find one.

See https://travis-ci.org/YannickJadoul/cibuildwheel/jobs/485146671 and https://api.travis-ci.org/v3/job/485146671/log.txt for a log of the installation and the permissions: user travis is a member of the admin group, so the group permissions are what you're looking for.

Not sure what's the best way to fix this, but I'm quite confident this is the problem.

I see e.g. /Library/Python/2.7/site-packages/-onfigparser-3.5.1.dist-info/, config -> -onfig ?!

This new method of generating temporary folder names also explains the weird - names. Probably leftovers from a failed/interrupted installations/updates? Cfr. #6194, as well.

@cjerdonek

This comment has been minimized.

Copy link
Member

cjerdonek commented Jan 27, 2019

@zooba This issue seems to be related to a PR you worked on before (see the previous comment).

@wildlyinaccurate

This comment has been minimized.

Copy link
Author

wildlyinaccurate commented Jan 27, 2019

It's possible that my original issue was actually a permissions mismatch -- the original modules were installed as root, and running pip install with sudo proceeds as expected with no issues.

@cjerdonek

This comment has been minimized.

Copy link
Member

cjerdonek commented Jan 27, 2019

Without knowing much, it seems like the right fix might be to distinguish between permissions issues and the path already existing when handling OSError in the code you linked to. Errors other than the file existing should bubble up.

@cjerdonek cjerdonek added the type: bug label Jan 27, 2019

@YannickJadoul

This comment has been minimized.

Copy link

YannickJadoul commented Jan 27, 2019

@wildlyinaccurate I think the confusion also stems from the fact that different permissions are involved. On the one hand, a package's folder can be unremovable (e.g., .../my-package), but this issue is linked to a new folder not being able to be created next to the installed package, in the parent folder (e.g., -y-package inside site-packages). That's why I never managed to reproduce the error locally.

EDIT: Seems it was too late yesterday to think clearly, and I think got the wrong folders names. site-packages is actually writable in my case, but its parent folder (python3.4 in my logs) is not. So when -ite-packages, ~ite-packages, .ite-packages, +ite-packages, ..., --te-packages, ... are tried to be created, this fails an exponential number of times.

@zooba

This comment has been minimized.

Copy link
Contributor

zooba commented Jan 28, 2019

@cjerdonek That sounds like a reasonable fix. I'll take a quick look

@pradyunsg

This comment has been minimized.

Copy link
Member

pradyunsg commented Feb 8, 2019

Thanks @zooba for the fix! :)

bors bot added a commit to mozilla/normandy that referenced this issue Feb 11, 2019

Merge #1726 #1732
1726: Update python:3.7-slim Docker digest to 8a125f6 r=peterbe a=renovate[bot]

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| python | digest | `3.7-slim` -> `8a125f6` |


1732: Scheduled weekly dependency update for week 06 r=peterbe a=pyup-bot






### Update [botocore](https://pypi.org/project/botocore) from **1.12.86** to **1.12.91**.


<details>
  <summary>Changelog</summary>
  
  
   ### 1.12.91
   ```
   =======

* api-change:``discovery``: Update discovery client to latest version
* api-change:``ecs``: Update ecs client to latest version
* api-change:``dlm``: Update dlm client to latest version
   ```
   
  
  
   ### 1.12.90
   ```
   =======

* api-change:``es``: Update es client to latest version
* api-change:``medialive``: Update medialive client to latest version
* api-change:``gamelift``: Update gamelift client to latest version
* api-change:``robomaker``: Update robomaker client to latest version
   ```
   
  
  
   ### 1.12.89
   ```
   =======

* api-change:``ec2``: Update ec2 client to latest version
* api-change:``fsx``: Update fsx client to latest version
   ```
   
  
  
   ### 1.12.88
   ```
   =======

* api-change:``shield``: Update shield client to latest version
* api-change:``servicecatalog``: Update servicecatalog client to latest version
* api-change:``ec2``: Update ec2 client to latest version
   ```
   
  
  
   ### 1.12.87
   ```
   =======

* api-change:``ecs``: Update ecs client to latest version
* api-change:``application-autoscaling``: Update application-autoscaling client to latest version
* api-change:``workspaces``: Update workspaces client to latest version
* api-change:``codecommit``: Update codecommit client to latest version
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/botocore
  - Changelog: https://pyup.io/changelogs/botocore/
  - Repo: https://github.com/boto/botocore
</details>





### Update [python-dateutil](https://pypi.org/project/python-dateutil) from **2.7.5** to **2.8.0**.


<details>
  <summary>Changelog</summary>
  
  
   ### 2.8.0
   ```
   ==========================

Data updates
------------

- Updated tzdata version to to 2018i.


Features
--------

- Added support for ``EXDATE`` parameters when parsing ``rrule`` strings.
  Reported by mlorant (gh issue 410), fixed by nicoe (gh pr 859).
- Added support for sub-minute time zone offsets in Python 3.6+.
  Fixed by cssherry (gh issue 582, pr 763)
- Switched the ``tzoffset``, ``tzstr`` and ``gettz`` caches over to using weak
  references, so that the cache expires when no other references to the
  original ``tzinfo`` objects exist. This cache-expiry behavior is not
  guaranteed in the public interface and may change in the future. To improve
  performance in the case where transient references to the same time zones
  are repeatedly created but no strong reference is continuously held, a
  smaller &quot;strong value&quot; cache was also added. Weak value cache implemented by
  cs-cordero (gh pr 672, 801), strong cache added by
  Gökçen Nurlu (gh issue 691, gh pr 761)


Bugfixes
--------

- Added time zone inference when initializing an ``rrule`` with a specified
  ``UNTIL`` but without an explicitly specified ``DTSTART``; the time zone
  of the generated ``DTSTART`` will now be taken from the ``UNTIL`` rule.
  Reported by href (gh issue 652). Fixed by absreim (gh pr 693).
- Fixed an issue where ``parser.parse`` would raise ``Decimal``-specific errors
  instead of a standard ``ValueError`` if certain malformed values were parsed
  (e.g. ``NaN`` or infinite values). Reported and fixed by
  amureki (gh issue 662, gh pr 679).
- Fixed issue in ``parser`` where a ``tzinfos`` call explicitly returning
  ``None`` would throw a ``ValueError``.
  Fixed by parsethis (gh issue 661, gh pr 681)
- Fixed incorrect parsing of certain dates earlier than 100 AD when repesented
  in the form &quot;%B.%Y.%d&quot;, e.g. &quot;December.0031.30&quot;. (gh issue 687, pr 700)
- Add support for ISO 8601 times with comma as the decimal separator in the
  ``dateutil.parser.isoparse`` function. (gh pr 721)
- Changed handling of ``T24:00`` to be compliant with the standard. ``T24:00``
  now represents midnight on the *following* day.
  Fixed by cheukting (gh issue 658, gh pr 751)
- Fixed an issue where ``isoparser.parse_isotime`` was unable to handle the
  ``24:00`` variant representation of midnight. (gh pr 773)
- Added support for more than 6 fractional digits in `isoparse`.
  Reported and fixed by jayschwa (gh issue 786, gh pr 787).
- Added &#39;z&#39; (lower case Z) as valid UTC time zone in isoparser.
  Reported by cjgibson (gh issue 820). Fixed by Cheukting (gh pr 822)
- Fixed a bug with base offset changes during DST in ``tzfile``, and refactored
  the way base offset changes are detected. Originally reported on
  StackOverflow by MartinThoma. (gh issue 812, gh pr 810)
- Fixed error condition in ``tz.gettz`` when a non-ASCII timezone is passed on
  Windows in Python 2.7. (gh issue 802, pr 861)
- Improved performance and inspection properties of ``tzname`` methods.
  (gh pr 811)
- Removed unnecessary binary_type compatibility shims.
  Added by jdufresne (gh pr 817)
- Changed ``python setup.py test`` to print an error to ``stderr`` and exit
  with 1 instead of 0. Reported and fixed by hroncok (gh pr 814)
- Added a ``pyproject.toml`` file with build requirements and an explicitly
  specified build backend. (gh issue 736, gh prs 746, 863)


Documentation changes
---------------------

- Added documentation for the ``rrule.rrulestr`` function.
  Fixed by prdickson (gh issue 623, gh pr 762)
- Added documentation for ``dateutil.tz.gettz``.
  Fixed by weatherpattern (gh issue 647, gh pr 704)
- Add documentation for the ``dateutil.tz.win`` module and mocked out certain
  Windows-specific modules so that autodoc can still be run on non-Windows
  systems. (gh issue 442, pr 715)
- Added changelog to documentation. (gh issue 692, gh pr 707)
- Changed order of keywords in the ``rrule`` docstring.
  Reported and fixed by rmahajan14 (gh issue 686, gh pr 695).
- Improved documentation on the use of ``until`` and ``count`` parameters in
  ``rrule``. Fixed by lucaferocino (gh pr 755).
- Added an example of how to use a custom ``parserinfo`` subclass to parse
  non-standard datetime formats in the examples documentation for ``parser``.
  Added by prdickson (gh 753)
- Added doctest examples to ``tzfile`` documentation.
  Patch by weatherpattern (gh pr 671)
- Updated the documentation for ``relativedelta``&#39;s ``weekday`` arguments.
  Fixed by kvn219 huangy22 and ElliotJH (gh pr 673)
- Improved explanation of the order that ``relativedelta`` components are
  applied in. Fixed by kvn219 huangy22 and ElliotJH (gh pr 673)
- Expanded the description and examples in the ``relativedelta`` class.
  Contributed by andrewcbennett (gh pr 759)
- Improved the contributing documentation to clarify where to put new changelog
  files. Contributed by andrewcbennett (gh pr 757)
- Fixed a broken doctest in the ``relativedelta`` module.
  Fixed by nherriot (gh pr 758).
- Changed the default theme to ``sphinx_rtd_theme``, and changed the sphinx
  configuration accordingly. (gh pr 707)
- Reorganized ``dateutil.tz`` documentation and fixed issue with the
  ``dateutil.tz`` docstring. (gh pr 714)
- Cleaned up malformed RST in the ``tz`` documentation.
  (gh issue 702, gh pr 706)
- Corrected link syntax and updated URL to https for ISO year week number
  notation in ``relativedelta`` examples. (gh issue 670, pr 711)


Misc
----

- GH 674, GH 688, GH 699, GH 720, GH 723, GH 726, GH 727, GH 740,
  GH 750, GH 760, GH 767, GH 772, GH 773, GH 780, GH 784, GH 785,
  GH 791, GH 799, GH 813, GH 836, GH 839, GH 857
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/python-dateutil
  - Changelog: https://pyup.io/changelogs/python-dateutil/
  - Docs: https://dateutil.readthedocs.io
</details>





### Update [s3transfer](https://pypi.org/project/s3transfer) from **0.1.13** to **0.2.0**.


<details>
  <summary>Changelog</summary>
  
  
   ### 0.2.0
   ```
   =====

* feature:``ProcessPoolDownloader``: Add ``ProcessPoolDownloader`` class to speed up download throughput by using processes instead of threads.
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/s3transfer
  - Changelog: https://pyup.io/changelogs/s3transfer/
  - Repo: https://github.com/boto/s3transfer
</details>





### Update [setuptools](https://pypi.org/project/setuptools) from **40.7.3** to **40.8.0**.


<details>
  <summary>Changelog</summary>
  
  
   ### 40.8.0
   ```
   -------

* 1652: Added the ``build_meta:__legacy__`` backend, a &quot;compatibility mode&quot; PEP 517 backend that can be used as the default when ``build-backend`` is left unspecified in ``pyproject.toml``.
* 1635: Resource paths are passed to ``pkg_resources.resource_string`` and similar no longer accept paths that traverse parents, that begin with a leading ``/``. Violations of this expectation raise DeprecationWarnings and will become errors. Additionally, any paths that are absolute on Windows are strictly disallowed and will raise ValueErrors.
* 1536: ``setuptools`` will now automatically include licenses if ``setup.cfg`` contains a ``license_file`` attribute, unless this file is manually excluded inside ``MANIFEST.in``.
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/setuptools
  - Changelog: https://pyup.io/changelogs/setuptools/
  - Repo: https://github.com/pypa/setuptools
</details>





### Update [boto3](https://pypi.org/project/boto3) from **1.9.86** to **1.9.91**.


<details>
  <summary>Changelog</summary>
  
  
   ### 1.9.91
   ```
   ======

* api-change:``discovery``: [``botocore``] Update discovery client to latest version
* api-change:``ecs``: [``botocore``] Update ecs client to latest version
* api-change:``dlm``: [``botocore``] Update dlm client to latest version
   ```
   
  
  
   ### 1.9.90
   ```
   ======

* api-change:``es``: [``botocore``] Update es client to latest version
* api-change:``medialive``: [``botocore``] Update medialive client to latest version
* api-change:``gamelift``: [``botocore``] Update gamelift client to latest version
* api-change:``robomaker``: [``botocore``] Update robomaker client to latest version
   ```
   
  
  
   ### 1.9.89
   ```
   ======

* api-change:``ec2``: [``botocore``] Update ec2 client to latest version
* api-change:``fsx``: [``botocore``] Update fsx client to latest version
   ```
   
  
  
   ### 1.9.88
   ```
   ======

* api-change:``shield``: [``botocore``] Update shield client to latest version
* api-change:``servicecatalog``: [``botocore``] Update servicecatalog client to latest version
* api-change:``ec2``: [``botocore``] Update ec2 client to latest version
   ```
   
  
  
   ### 1.9.87
   ```
   ======

* api-change:``ecs``: [``botocore``] Update ecs client to latest version
* api-change:``application-autoscaling``: [``botocore``] Update application-autoscaling client to latest version
* api-change:``workspaces``: [``botocore``] Update workspaces client to latest version
* api-change:``codecommit``: [``botocore``] Update codecommit client to latest version
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/boto3
  - Changelog: https://pyup.io/changelogs/boto3/
  - Repo: https://github.com/boto/boto3
</details>





### Update [Django](https://pypi.org/project/Django) from **2.0.10** to **2.0.12**.


<details>
  <summary>Changelog</summary>
  
  
   ### 2.0.12
   ```
   ===========================

*February 11, 2019*

Django 2.0.12 fixes a packaging error in 2.0.11.

Bugfixes
========

* Corrected packaging error from 2.0.11 (🎫`30175`).


===========================
   ```
   
  
  
   ### 2.0.11
   ```
   ===========================

*February 11, 2019*

Django 2.0.11 fixes a security issue in 2.0.10.

CVE-2019-6975: Memory exhaustion in ``django.utils.numberformat.format()``
--------------------------------------------------------------------------

If ``django.utils.numberformat.format()`` -- used by ``contrib.admin`` as well
as the the ``floatformat``, ``filesizeformat``, and ``intcomma`` templates
filters -- received a ``Decimal`` with a large number of digits or a large
exponent, it could lead to significant memory usage due to a call to
``&#39;{:f}&#39;.format()``.

To avoid this, decimals with more than 200 digits are now formatted using
scientific notation.


===========================
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/django
  - Changelog: https://pyup.io/changelogs/django/
  - Homepage: https://www.djangoproject.com/
</details>





### Update [pytest-testrail](https://pypi.org/project/pytest-testrail) from **2.3.2** to **2.3.3**.


<details>
  <summary>Changelog</summary>
  
  
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pytest-testrail
  - Changelog: https://pyup.io/changelogs/pytest-testrail/
  - Repo: http://github.com/allankp/pytest-testrail/
</details>





### Update [pip](https://pypi.org/project/pip) from **19.0.1** to **19.0.2**.


<details>
  <summary>Changelog</summary>
  
  
   ### 19.0.2
   ```
   ===================

Bug Fixes
---------

- Fix a crash where PEP 517-based builds using ``--no-cache-dir`` would fail in
  some circumstances with an ``AssertionError`` due to not finalizing a build
  directory internally. (`6197 &lt;https://github.com/pypa/pip/issues/6197&gt;`_)
- Provide a better error message if attempting an editable install of a
  directory with a ``pyproject.toml`` but no ``setup.py``. (`6170 &lt;https://github.com/pypa/pip/issues/6170&gt;`_)
- The implicit default backend used for projects that provide a ``pyproject.toml``
  file without explicitly specifying ``build-backend`` now behaves more like direct
  execution of ``setup.py``, and hence should restore compatibility with projects
  that were unable to be installed with ``pip`` 19.0. This raised the minimum
  required version of ``setuptools`` for such builds to 40.8.0. (`6163 &lt;https://github.com/pypa/pip/issues/6163&gt;`_)
- Allow ``RECORD`` lines with more than three elements, and display a warning. (`6165 &lt;https://github.com/pypa/pip/issues/6165&gt;`_)
- ``AdjacentTempDirectory`` fails on unwritable directory instead of locking up the uninstall command. (`6169 &lt;https://github.com/pypa/pip/issues/6169&gt;`_)
- Make failed uninstalls roll back more reliably and better at avoiding naming conflicts. (`6194 &lt;https://github.com/pypa/pip/issues/6194&gt;`_)
- Ensure the correct wheel file is copied when building PEP 517 distribution is built. (`6196 &lt;https://github.com/pypa/pip/issues/6196&gt;`_)
- The Python 2 end of life warning now only shows on CPython, which is the
  implementation that has announced end of life plans. (`6207 &lt;https://github.com/pypa/pip/issues/6207&gt;`_)

Improved Documentation
----------------------

- Re-write README and documentation index (`5815 &lt;https://github.com/pypa/pip/issues/5815&gt;`_)
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pip
  - Changelog: https://pyup.io/changelogs/pip/
  - Homepage: https://pip.pypa.io/
</details>







Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: pyup-bot <github-bot@pyup.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment