setup: add extra logic to try and recommend a new pip on bad Python

Modern pip can detect supported Python versions (which we now
declare), and pull down a reasonable release. This trick was suggested
in http://bit.ly/pycon2017-build-bridges, and seems like a good
defensive maneuver so that when we want to move to Python 3 it's
less risky for existing users.

This moves the version-check logic after defining our printf function
so we can print more informative messages.
This commit is contained in:
Augie Fackler 2017-07-21 10:46:31 -04:00
parent 4b55d62a6d
commit 527e838b00

View File

@ -24,9 +24,6 @@ if 'HGALLOWPYTHON3':
])
import sys, platform
if sys.version_info < (2, 7, 0, 'final'):
raise SystemExit('Mercurial requires Python 2.7 or later.')
if sys.version_info[0] >= 3:
printf = eval('print')
libdir_escape = 'unicode_escape'
@ -37,6 +34,33 @@ else:
end = kwargs.get('end', '\n')
f.write(b' '.join(args) + end)
# Attempt to guide users to a modern pip - this means that 2.6 users
# should have a chance of getting a 4.2 release, and when we ratchet
# the version requirement forward again hopefully everyone will get
# something that works for them.
if sys.version_info < (2, 7, 0, 'final'):
pip_message = ('This may be due to an out of date pip. '
'Make sure you have pip >= 9.0.1.')
try:
import pip
pip_version = tuple([int(x) for x in pip.__version__.split('.')[:3]])
if pip_version < (9, 0, 1) :
pip_message = (
'Your pip version is out of date, please install '
'pip >= 9.0.1. pip {} detected.'.format(pip.__version__))
else:
# pip is new enough - it must be something else
pip_message = ''
except Exception:
pass
error = """
Mercurial does not support Python older than 2.7.
Python {py} detected.
{pip}
""".format(py=sys.version_info, pip=pip_message)
printf(error, file=sys.stderr)
sys.exit(1)
# Solaris Python packaging brain damage
try:
import hashlib