Skip to content
Newer
Older
100644 245 lines (219 sloc) 10.1 KB
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
1 #!python
2 """Bootstrap setuptools installation
3
4 If you want to use setuptools in your package's setup.py, just include this
5 file in the same directory with it, and add this to the top of your setup.py::
6
7 from ez_setup import use_setuptools
8 use_setuptools()
9
10 If you want to require a specific version of setuptools, set a download
11 mirror, or use an alternate download directory, you can do so by supplying
12 the appropriate options to ``use_setuptools()``.
13
14 This file can also be run as a script to install or upgrade setuptools.
15 """
16 import sys
f4f06d6 @WayneSan Update the default setuptools version to '0.6c11'
WayneSan authored Nov 8, 2010
17 DEFAULT_VERSION = "0.6c11"
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
18 DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
19
20 md5_data = {
21 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
22 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
23 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
24 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
25 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
26 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
27 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
28 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
29 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
30 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
31 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
32 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
33 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
34 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
35 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
36 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
37 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
38 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
39 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
40 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
41 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
42 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
43 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
44 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
45 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
46 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
47 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
48 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
49 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
50 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
51 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
52 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
53 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
54 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
f4f06d6 @WayneSan Update the default setuptools version to '0.6c11'
WayneSan authored Nov 8, 2010
55 'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090',
56 'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4',
57 'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7',
58 'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5',
59 'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de',
60 'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b',
61 'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2',
62 'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086',
63 'setuptools-0.6c11-py2.7.egg': 'fe1f997bc722265116870bc7919059ea',
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
64 }
65
c25b014 e3: Fix some pylint warnings and make some other modifications that m…
The98 authored Aug 10, 2011
66 import os
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
67 try: from hashlib import md5
68 except ImportError: from md5 import md5
69
70 def _validate_md5(egg_name, data):
71 if egg_name in md5_data:
72 digest = md5(data).hexdigest()
73 if digest != md5_data[egg_name]:
74 print >>sys.stderr, (
75 "md5 validation of %s failed! (Possible download problem?)"
76 % egg_name
77 )
78 sys.exit(2)
79 return data
80
81 def use_setuptools(
82 version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
83 download_delay=15
84 ):
85 """Automatically find/download setuptools and make it available on sys.path
86
87 `version` should be a valid setuptools version number that is available
88 as an egg for download under the `download_base` URL (which should end with
89 a '/'). `to_dir` is the directory where setuptools will be downloaded, if
90 it is not already available. If `download_delay` is specified, it should
91 be the number of seconds that will be paused before initiating a download,
92 should one be required. If an older version of setuptools is installed,
93 this routine will print a message to ``sys.stderr`` and raise SystemExit in
94 an attempt to abort the calling script.
95 """
96 was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
97 def do_download():
98 egg = download_setuptools(version, download_base, to_dir, download_delay)
99 sys.path.insert(0, egg)
100 import setuptools; setuptools.bootstrap_install_from = egg
101 try:
102 import pkg_resources
103 except ImportError:
c25b014 e3: Fix some pylint warnings and make some other modifications that m…
The98 authored Aug 11, 2011
104 return do_download()
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
105 try:
106 pkg_resources.require("setuptools>="+version); return
107 except pkg_resources.VersionConflict, e:
108 if was_imported:
109 print >>sys.stderr, (
110 "The required version of setuptools (>=%s) is not available, and\n"
111 "can't be installed while this script is running. Please install\n"
112 " a more recent version first, using 'easy_install -U setuptools'."
113 "\n\n(Currently using %r)"
114 ) % (version, e.args[0])
115 sys.exit(2)
116 else:
117 del pkg_resources, sys.modules['pkg_resources'] # reload ok
118 return do_download()
119 except pkg_resources.DistributionNotFound:
120 return do_download()
121
122 def download_setuptools(
123 version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
124 delay = 15
125 ):
126 """Download setuptools from a specified location and return its filename
127
128 `version` should be a valid setuptools version number that is available
129 as an egg for download under the `download_base` URL (which should end
130 with a '/'). `to_dir` is the directory where the egg will be downloaded.
131 `delay` is the number of seconds to pause before an actual download attempt.
132 """
bfea01a @Sbte Remove some unused imports
Sbte authored Jan 16, 2011
133 import urllib2
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
134 egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
135 url = download_base + egg_name
136 saveto = os.path.join(to_dir, egg_name)
137 src = dst = None
138 if not os.path.exists(saveto): # Avoid repeated downloads
139 try:
140 from distutils import log
141 if delay:
142 log.warn("""
143 ---------------------------------------------------------------------------
144 This script requires setuptools version %s to run (even to display
145 help). I will attempt to download it for you (from
146 %s), but
147 you may need to enable firewall access for this script first.
148 I will start the download in %d seconds.
149
150 (Note: if this machine does not have network access, please obtain the file
151
152 %s
153
154 and place it in this directory before rerunning this script.)
155 ---------------------------------------------------------------------------""",
156 version, download_base, delay, url
157 ); from time import sleep; sleep(delay)
158 log.warn("Downloading %s", url)
159 src = urllib2.urlopen(url)
160 # Read/write all in one block, so we don't create a corrupt file
161 # if the download is interrupted.
162 data = _validate_md5(egg_name, src.read())
163 dst = open(saveto,"wb"); dst.write(data)
164 finally:
165 if src: src.close()
166 if dst: dst.close()
167 return os.path.realpath(saveto)
168
169 def main(argv, version=DEFAULT_VERSION):
170 """Install or upgrade setuptools and EasyInstall"""
171 try:
172 import setuptools
173 except ImportError:
174 egg = None
175 try:
176 egg = download_setuptools(version, delay=0)
c25b014 e3: Fix some pylint warnings and make some other modifications that m…
The98 authored Aug 11, 2011
177 sys.path.insert(0, egg)
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
178 from setuptools.command.easy_install import main
179 return main(list(argv)+[egg]) # we're done here
180 finally:
181 if egg and os.path.exists(egg):
182 os.unlink(egg)
183 else:
184 if setuptools.__version__ == '0.0.1':
c25b014 e3: Fix some pylint warnings and make some other modifications that m…
The98 authored Aug 11, 2011
185 print >> sys.stderr, (
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
186 "You have an obsolete version of setuptools installed. Please\n"
187 "remove it from your system entirely before rerunning this script."
188 )
189 sys.exit(2)
190
191 req = "setuptools>="+version
192 import pkg_resources
193 try:
194 pkg_resources.require(req)
195 except pkg_resources.VersionConflict:
196 try:
197 from setuptools.command.easy_install import main
198 except ImportError:
199 from easy_install import main
200 main(list(argv)+[download_setuptools(delay=0)])
201 sys.exit(0) # try to force an exit
202 else:
203 if argv:
204 from setuptools.command.easy_install import main
205 main(argv)
206 else:
c25b014 e3: Fix some pylint warnings and make some other modifications that m…
The98 authored Aug 11, 2011
207 print "Setuptools version", version, "or greater has been installed."
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
208 print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
209
210 def update_md5(filenames):
211 """Update our built-in md5 registry"""
212
213 import re
214
215 for name in filenames:
216 base = os.path.basename(name)
217 f = open(name,'rb')
218 md5_data[base] = md5(f.read()).hexdigest()
219 f.close()
220
221 data = [" %r: %r,\n" % it for it in md5_data.items()]
222 data.sort()
223 repl = "".join(data)
224
225 import inspect
226 srcfile = inspect.getsourcefile(sys.modules[__name__])
227 f = open(srcfile, 'rb'); src = f.read(); f.close()
228
229 match = re.search("\nmd5_data = {\n([^}]+)}", src)
230 if not match:
231 print >>sys.stderr, "Internal error!"
232 sys.exit(2)
233
234 src = src[:match.start(1)] + repl + src[match.end(1):]
235 f = open(srcfile,'w')
236 f.write(src)
237 f.close()
238
239
c25b014 e3: Fix some pylint warnings and make some other modifications that m…
The98 authored Aug 11, 2011
240 if __name__ == '__main__':
241 if len(sys.argv) > 2 and sys.argv[1] == '--md5update':
6f732f9 @c10ud more work toward sane directory structure
c10ud authored Jun 2, 2010
242 update_md5(sys.argv[2:])
243 else:
244 main(sys.argv[1:])
Something went wrong with that request. Please try again.