Skip to content

Commit d0b7708

Browse files
committed
When pip was not installed by pip, don't show the upgrade warning
Fixes #5346
1 parent 21b97e4 commit d0b7708

File tree

3 files changed

+47
-7
lines changed

3 files changed

+47
-7
lines changed

news/5346.bugfix

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Disable pip's version check (and upgrade message) when installed by a different package manager.
2+
3+
This works better with Linux distributions where pip's upgrade message may
4+
result in users running pip in a manner that modifies files that should be
5+
managed by the OS's package manager.

src/pip/_internal/utils/outdated.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import os.path
77
import sys
88

9-
from pip._vendor import lockfile
9+
from pip._vendor import lockfile, pkg_resources
1010
from pip._vendor.packaging import version as packaging_version
1111

1212
from pip._internal.compat import WINDOWS
@@ -58,6 +58,20 @@ def save(self, pypi_version, current_time):
5858
separators=(",", ":"))
5959

6060

61+
def pip_installed_by_pip():
62+
"""Checks whether pip was installed by pip
63+
64+
This is used not to display the upgrade message when pip is in fact
65+
installed by system package manager, such as dnf on Fedora.
66+
"""
67+
try:
68+
dist = pkg_resources.get_distribution('pip')
69+
return (dist.has_metadata('INSTALLER') and
70+
'pip' in dist.get_metadata_lines('INSTALLER'))
71+
except pkg_resources.DistributionNotFound:
72+
return False
73+
74+
6175
def pip_version_check(session, options):
6276
"""Check for an update for pip.
6377
@@ -110,7 +124,8 @@ def pip_version_check(session, options):
110124

111125
# Determine if our pypi_version is older
112126
if (pip_version < remote_version and
113-
pip_version.base_version != remote_version.base_version):
127+
pip_version.base_version != remote_version.base_version and
128+
pip_installed_by_pip()):
114129
# Advise "python -m pip" on Windows to avoid issues
115130
# with overwriting pip.exe.
116131
if WINDOWS:

tests/unit/test_unit_outdated.py

+25-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import freezegun
88
import pretend
99
import pytest
10-
from pip._vendor import lockfile
10+
from pip._vendor import lockfile, pkg_resources
1111

1212
from pip._internal.index import InstallationCandidate
1313
from pip._internal.utils import outdated
@@ -33,6 +33,20 @@ def find_all_candidates(self, project_name):
3333
return self.INSTALLATION_CANDIDATES
3434

3535

36+
class MockDistribution(object):
37+
def __init__(self, installer):
38+
self.installer = installer
39+
40+
def has_metadata(self, name):
41+
return name == 'INSTALLER'
42+
43+
def get_metadata_lines(self, name):
44+
if self.has_metadata(name):
45+
yield self.installer
46+
else:
47+
raise NotImplementedError('nope')
48+
49+
3650
def _options():
3751
''' Some default options that we pass to outdated.pip_version_check '''
3852
return pretend.stub(
@@ -47,27 +61,33 @@ def _options():
4761
'stored_time',
4862
'installed_ver',
4963
'new_ver',
64+
'installer',
5065
'check_if_upgrade_required',
5166
'check_warn_logs',
5267
],
5368
[
5469
# Test we return None when installed version is None
55-
('1970-01-01T10:00:00Z', None, '1.0', False, False),
70+
('1970-01-01T10:00:00Z', None, '1.0', 'pip', False, False),
5671
# Need an upgrade - upgrade warning should print
57-
('1970-01-01T10:00:00Z', '1.0', '6.9.0', True, True),
72+
('1970-01-01T10:00:00Z', '1.0', '6.9.0', 'pip', True, True),
73+
# Upgrade available, pip installed via rpm - warning should not print
74+
('1970-01-01T10:00:00Z', '1.0', '6.9.0', 'rpm', True, False),
5875
# No upgrade - upgrade warning should not print
59-
('1970-01-9T10:00:00Z', '6.9.0', '6.9.0', False, False),
76+
('1970-01-9T10:00:00Z', '6.9.0', '6.9.0', 'pip', False, False),
6077
]
6178
)
6279
def test_pip_version_check(monkeypatch, stored_time, installed_ver, new_ver,
63-
check_if_upgrade_required, check_warn_logs):
80+
installer, check_if_upgrade_required,
81+
check_warn_logs):
6482
monkeypatch.setattr(outdated, 'get_installed_version',
6583
lambda name: installed_ver)
6684
monkeypatch.setattr(outdated, 'PackageFinder', MockPackageFinder)
6785
monkeypatch.setattr(outdated.logger, 'warning',
6886
pretend.call_recorder(lambda *a, **kw: None))
6987
monkeypatch.setattr(outdated.logger, 'debug',
7088
pretend.call_recorder(lambda s, exc_info=None: None))
89+
monkeypatch.setattr(pkg_resources, 'get_distribution',
90+
lambda name: MockDistribution(installer))
7191

7292
fake_state = pretend.stub(
7393
state={"last_check": stored_time, 'pypi_version': installed_ver},

0 commit comments

Comments
 (0)