Commit 52d7b45588f21c3298f49ac7faf21c3f3e0fd04e
1 parent
ea0a3cc6
Update ez_setup.py to the latest upstream revision
Source: Repo: git://github.com/pypa/setuptools.git Branch: bootstrap Commit: 0c3bf692236350f5c2c2cab5b235e9b6d3518fcb Notice: Line 39 remained unchanged, so the default version of setuptools is still `18.3.2` instead of `LATEST`.
Showing
1 changed file
with
67 additions
and
22 deletions
... | ... | @@ -3,6 +3,8 @@ |
3 | 3 | """ |
4 | 4 | Setuptools bootstrapping installer. |
5 | 5 | |
6 | +Maintained at https://github.com/pypa/setuptools/tree/bootstrap. | |
7 | + | |
6 | 8 | Run this script to install or upgrade setuptools. |
7 | 9 | """ |
8 | 10 | |
... | ... | @@ -16,24 +18,30 @@ import subprocess |
16 | 18 | import platform |
17 | 19 | import textwrap |
18 | 20 | import contextlib |
19 | -import warnings | |
21 | +import json | |
22 | +import codecs | |
20 | 23 | |
21 | 24 | from distutils import log |
22 | 25 | |
23 | 26 | try: |
24 | 27 | from urllib.request import urlopen |
28 | + from urllib.parse import urljoin | |
25 | 29 | except ImportError: |
26 | 30 | from urllib2 import urlopen |
31 | + from urlparse import urljoin | |
27 | 32 | |
28 | 33 | try: |
29 | 34 | from site import USER_SITE |
30 | 35 | except ImportError: |
31 | 36 | USER_SITE = None |
32 | 37 | |
38 | +LATEST = object() | |
33 | 39 | DEFAULT_VERSION = "18.3.2" |
34 | -DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/" | |
40 | +DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/" | |
35 | 41 | DEFAULT_SAVE_DIR = os.curdir |
36 | 42 | |
43 | +MEANINGFUL_INVALID_ZIP_ERR_MSG = 'Maybe {0} is corrupted, delete it and try again.' | |
44 | + | |
37 | 45 | |
38 | 46 | def _python_cmd(*args): |
39 | 47 | """ |
... | ... | @@ -98,8 +106,16 @@ def archive_context(filename): |
98 | 106 | old_wd = os.getcwd() |
99 | 107 | try: |
100 | 108 | os.chdir(tmpdir) |
101 | - with ContextualZipFile(filename) as archive: | |
102 | - archive.extractall() | |
109 | + try: | |
110 | + with ContextualZipFile(filename) as archive: | |
111 | + archive.extractall() | |
112 | + except zipfile.BadZipfile as err: | |
113 | + if not err.args: | |
114 | + err.args = ('', ) | |
115 | + err.args = err.args + ( | |
116 | + MEANINGFUL_INVALID_ZIP_ERR_MSG.format(filename), | |
117 | + ) | |
118 | + raise | |
103 | 119 | |
104 | 120 | # going in the directory |
105 | 121 | subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) |
... | ... | @@ -114,18 +130,19 @@ def archive_context(filename): |
114 | 130 | |
115 | 131 | def _do_download(version, download_base, to_dir, download_delay): |
116 | 132 | """Download Setuptools.""" |
117 | - egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg' | |
118 | - % (version, sys.version_info[0], sys.version_info[1])) | |
133 | + py_desig = 'py{sys.version_info[0]}.{sys.version_info[1]}'.format(sys=sys) | |
134 | + tp = 'setuptools-{version}-{py_desig}.egg' | |
135 | + egg = os.path.join(to_dir, tp.format(**locals())) | |
119 | 136 | if not os.path.exists(egg): |
120 | 137 | archive = download_setuptools(version, download_base, |
121 | - to_dir, download_delay) | |
138 | + to_dir, download_delay) | |
122 | 139 | _build_egg(egg, archive, to_dir) |
123 | 140 | sys.path.insert(0, egg) |
124 | 141 | |
125 | 142 | # Remove previously-imported pkg_resources if present (see |
126 | 143 | # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). |
127 | 144 | if 'pkg_resources' in sys.modules: |
128 | - del sys.modules['pkg_resources'] | |
145 | + _unload_pkg_resources() | |
129 | 146 | |
130 | 147 | import setuptools |
131 | 148 | setuptools.bootstrap_install_from = egg |
... | ... | @@ -140,6 +157,7 @@ def use_setuptools( |
140 | 157 | Return None. Raise SystemExit if the requested version |
141 | 158 | or later cannot be installed. |
142 | 159 | """ |
160 | + version = _resolve_version(version) | |
143 | 161 | to_dir = os.path.abspath(to_dir) |
144 | 162 | |
145 | 163 | # prior to importing, capture the module state for |
... | ... | @@ -189,6 +207,11 @@ def _conflict_bail(VC_err, version): |
189 | 207 | |
190 | 208 | |
191 | 209 | def _unload_pkg_resources(): |
210 | + sys.meta_path = [ | |
211 | + importer | |
212 | + for importer in sys.meta_path | |
213 | + if importer.__class__.__module__ != 'pkg_resources.extern' | |
214 | + ] | |
192 | 215 | del_modules = [ |
193 | 216 | name for name in sys.modules |
194 | 217 | if name.startswith('pkg_resources') |
... | ... | @@ -222,8 +245,8 @@ def download_file_powershell(url, target): |
222 | 245 | ps_cmd = ( |
223 | 246 | "[System.Net.WebRequest]::DefaultWebProxy.Credentials = " |
224 | 247 | "[System.Net.CredentialCache]::DefaultCredentials; " |
225 | - "(new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)" | |
226 | - % vars() | |
248 | + '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")' | |
249 | + % locals() | |
227 | 250 | ) |
228 | 251 | cmd = [ |
229 | 252 | 'powershell', |
... | ... | @@ -248,7 +271,7 @@ download_file_powershell.viable = has_powershell |
248 | 271 | |
249 | 272 | |
250 | 273 | def download_file_curl(url, target): |
251 | - cmd = ['curl', url, '--silent', '--output', target] | |
274 | + cmd = ['curl', url, '--location', '--silent', '--output', target] | |
252 | 275 | _clean_check(cmd, target) |
253 | 276 | |
254 | 277 | |
... | ... | @@ -321,6 +344,7 @@ def download_setuptools( |
321 | 344 | ``downloader_factory`` should be a function taking no arguments and |
322 | 345 | returning a function for downloading a URL to a target. |
323 | 346 | """ |
347 | + version = _resolve_version(version) | |
324 | 348 | # making sure we use the absolute path |
325 | 349 | to_dir = os.path.abspath(to_dir) |
326 | 350 | zip_name = "setuptools-%s.zip" % version |
... | ... | @@ -333,6 +357,27 @@ def download_setuptools( |
333 | 357 | return os.path.realpath(saveto) |
334 | 358 | |
335 | 359 | |
360 | +def _resolve_version(version): | |
361 | + """ | |
362 | + Resolve LATEST version | |
363 | + """ | |
364 | + if version is not LATEST: | |
365 | + return version | |
366 | + | |
367 | + meta_url = urljoin(DEFAULT_URL, '/pypi/setuptools/json') | |
368 | + resp = urlopen(meta_url) | |
369 | + with contextlib.closing(resp): | |
370 | + try: | |
371 | + charset = resp.info().get_content_charset() | |
372 | + except Exception: | |
373 | + # Python 2 compat; assume UTF-8 | |
374 | + charset = 'UTF-8' | |
375 | + reader = codecs.getreader(charset) | |
376 | + doc = json.load(reader(resp)) | |
377 | + | |
378 | + return str(doc['info']['version']) | |
379 | + | |
380 | + | |
336 | 381 | def _build_install_args(options): |
337 | 382 | """ |
338 | 383 | Build the arguments to 'python setup.py install' on the setuptools package. |
... | ... | @@ -347,7 +392,7 @@ def _parse_args(): |
347 | 392 | parser = optparse.OptionParser() |
348 | 393 | parser.add_option( |
349 | 394 | '--user', dest='user_install', action='store_true', default=False, |
350 | - help='install in user site package (requires Python 2.6 or later)') | |
395 | + help='install in user site package') | |
351 | 396 | parser.add_option( |
352 | 397 | '--download-base', dest='download_base', metavar="URL", |
353 | 398 | default=DEFAULT_URL, |
... | ... | @@ -362,9 +407,9 @@ def _parse_args(): |
362 | 407 | default=DEFAULT_VERSION, |
363 | 408 | ) |
364 | 409 | parser.add_option( |
365 | - '--to-dir', | |
366 | - help="Directory to save (and re-use) package", | |
367 | - default=DEFAULT_SAVE_DIR, | |
410 | + '--to-dir', | |
411 | + help="Directory to save (and re-use) package", | |
412 | + default=DEFAULT_SAVE_DIR, | |
368 | 413 | ) |
369 | 414 | options, args = parser.parse_args() |
370 | 415 | # positional arguments are ignored |
... | ... | @@ -372,13 +417,13 @@ def _parse_args(): |
372 | 417 | |
373 | 418 | |
374 | 419 | def _download_args(options): |
375 | - """Return args for download_setuptools function from cmdline args.""" | |
376 | - return dict( | |
377 | - version=options.version, | |
378 | - download_base=options.download_base, | |
379 | - downloader_factory=options.downloader_factory, | |
380 | - to_dir=options.to_dir, | |
381 | - ) | |
420 | + """Return args for download_setuptools function from cmdline args.""" | |
421 | + return dict( | |
422 | + version=options.version, | |
423 | + download_base=options.download_base, | |
424 | + downloader_factory=options.downloader_factory, | |
425 | + to_dir=options.to_dir, | |
426 | + ) | |
382 | 427 | |
383 | 428 | |
384 | 429 | def main(): | ... | ... |
Please
register
or
login
to post a comment