File: ensurepip-wheels

package info (click to toggle)
pypy 5.6.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 97,040 kB
  • ctags: 185,069
  • sloc: python: 1,147,862; ansic: 49,642; cpp: 5,245; asm: 5,169; makefile: 529; sh: 481; xml: 232; lisp: 45
file content (146 lines) | stat: -rw-r--r-- 5,378 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Description: Let ensurepip use the system wheels
 Not the ones from the python source.
Origin: Debian cpython packaging
Last-Update: 2015-03-26

--- a/lib-python/2.7/ensurepip/__init__.py
+++ b/lib-python/2.7/ensurepip/__init__.py
@@ -1,6 +1,7 @@
 #!/usr/bin/env python2
 from __future__ import print_function
 
+import glob
 import os
 import os.path
 import pkgutil
@@ -12,13 +13,9 @@
 __all__ = ["version", "bootstrap"]
 
 
-_SETUPTOOLS_VERSION = "20.10.1"
-
-_PIP_VERSION = "8.1.1"
-
 # pip currently requires ssl support, so we try to provide a nicer
 # error message when that is missing (http://bugs.python.org/issue19744)
-_MISSING_SSL_MESSAGE = ("pip {} requires SSL/TLS".format(_PIP_VERSION))
+_MISSING_SSL_MESSAGE = ("pip requires SSL/TLS")
 try:
     import ssl
 except ImportError:
@@ -31,8 +28,8 @@
         pass
 
 _PROJECTS = [
-    ("setuptools", _SETUPTOOLS_VERSION),
-    ("pip", _PIP_VERSION),
+    "setuptools",
+    "pip",
 ]
 
 
@@ -50,7 +47,11 @@
     """
     Returns a string specifying the bundled version of pip.
     """
-    return _PIP_VERSION
+    whl_name = 'pip'
+    wheel_names = glob.glob('/usr/share/python-wheels/%s-*.whl' % whl_name)
+    if len(wheel_names) == 1:
+        return os.path.basename(wheel_names[0]).split('-')[1]
+    raise RuntimeError('missing dependency wheel %s. Installation of the python-%s-whl package is needed to use ensurepip.' % (whl_name, whl_name))
 
 
 def _disable_pip_configuration_settings():
@@ -93,21 +94,53 @@
         # omit pip and easy_install
         os.environ["ENSUREPIP_OPTIONS"] = "install"
 
+    # Debian: The bundled wheels are useless to us because we must use ones
+    # crafted from source code in the archive.  As we build the virtual
+    # environment, copy the wheels from the system location into the virtual
+    # environment, and place those wheels on sys.path.
+    def copy_wheels(wheels, destdir, paths):
+        for project in wheels:
+            wheel_names = glob.glob(
+                '/usr/share/python-wheels/{}-*.whl'.format(project))
+            if len(wheel_names) == 0:
+                raise RuntimeError('missing dependency wheel %s. Installation of the python-%s-whl package is needed to use ensurepip.' % (project, project))
+            assert len(wheel_names) == 1, wheel_names
+            wheel_name = os.path.basename(wheel_names[0])
+            path = os.path.join('/usr/share/python-wheels', wheel_name)
+            with open(path, 'rb') as fp:
+                whl = fp.read()
+            dest = os.path.join(destdir, wheel_name)
+            with open(dest, 'wb') as fp:
+                fp.write(whl)
+            paths.append(dest)
+
+    # check that the python-{pip,setuptools}-whl packages are installed
+    missing = []
+    for project in reversed(_PROJECTS):
+        wheel_names = glob.glob('/usr/share/python-wheels/%s-*.whl' % project)
+        if len(wheel_names) != 1:
+            missing.append(project)
+    if missing:
+        raise RuntimeError('missing wheel(s) %s. Installation of the %s package(s) is needed to use ensurepip.' \
+                           % (', '.join([missing]),
+                              ', '.join(['python-%s-whl' % m for m in missing])) \
+                           )
+
     tmpdir = tempfile.mkdtemp()
+
+    for project in _PROJECTS:
+        try:
+            with open('/usr/share/python-wheels/%s.dependencies' % project) as fp:
+                dependencies = [line[:-1].split()[0] for line in fp.readlines()]
+        except IOError:
+            dependencies = []
+        copy_wheels(dependencies, tmpdir, sys.path)
+
     try:
         # Put our bundled wheels into a temporary directory and construct the
         # additional paths that need added to sys.path
         additional_paths = []
-        for project, version in _PROJECTS:
-            wheel_name = "{}-{}-py2.py3-none-any.whl".format(project, version)
-            whl = pkgutil.get_data(
-                "ensurepip",
-                "_bundled/{}".format(wheel_name),
-            )
-            with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
-                fp.write(whl)
-
-            additional_paths.append(os.path.join(tmpdir, wheel_name))
+        copy_wheels(_PROJECTS, tmpdir, additional_paths)
 
         # Construct the arguments to be passed to the pip command
         args = ["install", "--no-index", "--find-links", tmpdir]
@@ -120,7 +153,7 @@
         if verbosity:
             args += ["-" + "v" * verbosity]
 
-        _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
+        _run_pip(args + _PROJECTS, additional_paths)
     finally:
         shutil.rmtree(tmpdir, ignore_errors=True)
 
@@ -137,7 +170,8 @@
         return
 
     # If the pip version doesn't match the bundled one, leave it alone
-    if pip.__version__ != _PIP_VERSION:
+    # Disabled for Debian, always using the version from the python3-pip package.
+    if False and pip.__version__ != _PIP_VERSION:
         msg = ("ensurepip will only uninstall a matching version "
                "({!r} installed, {!r} bundled)")
         print(msg.format(pip.__version__, _PIP_VERSION), file=sys.stderr)
@@ -151,7 +185,7 @@
     if verbosity:
         args += ["-" + "v" * verbosity]
 
-    _run_pip(args + [p[0] for p in reversed(_PROJECTS)])
+    _run_pip(args + reversed(_PROJECTS))
 
 
 def _main(argv=None):