PageRenderTime 54ms CodeModel.GetById 33ms app.highlight 16ms RepoModel.GetById 1ms app.codeStats 1ms

/thirdparty/breakpad/third_party/protobuf/protobuf/python/ez_setup.py

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