/ez_setup.py

1#!python 2"""Bootstrap setuptools installation 3 4If you want to use setuptools in your package's setup.py, just include this 5file 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 10If you want to require a specific version of setuptools, set a download 11mirror, or use an alternate download directory, you can do so by supplying 12the appropriate options to ``use_setuptools()``. 13 14This file can also be run as a script to install or upgrade setuptools. 15""" 16importsys 17DEFAULT_VERSION="0.6c11" 18DEFAULT_URL="http://pypi.python.org/packages/%s/s/setuptools/"%sys.version[:3] 19 20md5_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.6c10-py2.3.egg':'ce1e2ab5d3a0256456d9fc13800a7090', 32'setuptools-0.6c10-py2.4.egg':'57d6d9d6e9b80772c59a53a8433a5dd4', 33'setuptools-0.6c10-py2.5.egg':'de46ac8b1c97c895572e5e8596aeb8c7', 34'setuptools-0.6c10-py2.6.egg':'58ea40aef06da02ce641495523a0b7f5', 35'setuptools-0.6c11-py2.3.egg':'2baeac6e13d414a9d28e7ba5b5a596de', 36'setuptools-0.6c11-py2.4.egg':'bd639f9b0eac4c42497034dec2ec0c2b', 37'setuptools-0.6c11-py2.5.egg':'64c94f3bf7a72a13ec83e0b24f2749b2', 38'setuptools-0.6c11-py2.6.egg':'bfa92100bd772d5a213eedd356d64086', 39'setuptools-0.6c2-py2.3.egg':'f0064bf6aa2b7d0f3ba0b43f20817c27', 40'setuptools-0.6c2-py2.4.egg':'616192eec35f47e8ea16cd6a122b7277', 41'setuptools-0.6c3-py2.3.egg':'f181fa125dfe85a259c9cd6f1d7b78fa', 42'setuptools-0.6c3-py2.4.egg':'e0ed74682c998bfb73bf803a50e7b71e', 43'setuptools-0.6c3-py2.5.egg':'abef16fdd61955514841c7c6bd98965e', 44'setuptools-0.6c4-py2.3.egg':'b0b9131acab32022bfac7f44c5d7971f', 45'setuptools-0.6c4-py2.4.egg':'2a1f9656d4fbf3c97bf946c0a124e6e2', 46'setuptools-0.6c4-py2.5.egg':'8f5a052e32cdb9c72bcf4b5526f28afc', 47'setuptools-0.6c5-py2.3.egg':'ee9fd80965da04f2f3e6b3576e9d8167', 48'setuptools-0.6c5-py2.4.egg':'afe2adf1c01701ee841761f5bcd8aa64', 49'setuptools-0.6c5-py2.5.egg':'a8d3f61494ccaa8714dfed37bccd3d5d', 50'setuptools-0.6c6-py2.3.egg':'35686b78116a668847237b69d549ec20', 51'setuptools-0.6c6-py2.4.egg':'3c56af57be3225019260a644430065ab', 52'setuptools-0.6c6-py2.5.egg':'b2f8a7520709a5b34f80946de5f02f53', 53'setuptools-0.6c7-py2.3.egg':'209fdf9adc3a615e5115b725658e13e2', 54'setuptools-0.6c7-py2.4.egg':'5a8f954807d46a0fb67cf1f26c55a82e', 55'setuptools-0.6c7-py2.5.egg':'45d2ad28f9750e7434111fde831e8372', 56'setuptools-0.6c8-py2.3.egg':'50759d29b349db8cfd807ba8303f1902', 57'setuptools-0.6c8-py2.4.egg':'cba38d74f7d483c06e9daa6070cce6de', 58'setuptools-0.6c8-py2.5.egg':'1721747ee329dc150590a58b3e1ac95b', 59'setuptools-0.6c9-py2.3.egg':'a83c4020414807b496e4cfbe08507c03', 60'setuptools-0.6c9-py2.4.egg':'260a2be2e5388d66bdaee06abec6342a', 61'setuptools-0.6c9-py2.5.egg':'fe67c3e5a17b12c0e7c541b7ea43a8e6', 62'setuptools-0.6c9-py2.6.egg':'ca37b1ff16fa2ede6e19383e7b59245a', 63} 64 65importsys,os 66try:fromhashlibimportmd5 67exceptImportError:frommd5importmd5 68 69def_validate_md5(egg_name,data): 70ifegg_nameinmd5_data: 71digest=md5(data).hexdigest() 72ifdigest!=md5_data[egg_name]: 73print>>sys.stderr,( 74"md5 validation of %s failed! (Possible download problem?)" 75%egg_name 76) 77sys.exit(2) 78returndata 79 80defuse_setuptools( 81version=DEFAULT_VERSION,download_base=DEFAULT_URL,to_dir=os.curdir, 82download_delay=15 83): 84"""Automatically find/download setuptools and make it available on sys.path 85 86 `version` should be a valid setuptools version number that is available 87 as an egg for download under the `download_base` URL (which should end with 88 a '/'). `to_dir` is the directory where setuptools will be downloaded, if 89 it is not already available. If `download_delay` is specified, it should 90 be the number of seconds that will be paused before initiating a download, 91 should one be required. If an older version of setuptools is installed, 92 this routine will print a message to ``sys.stderr`` and raise SystemExit in 93 an attempt to abort the calling script. 94""" 95was_imported='pkg_resources'insys.modulesor'setuptools'insys.modules 96defdo_download(): 97egg=download_setuptools(version,download_base,to_dir,download_delay) 98sys.path.insert(0,egg) 99importsetuptools;setuptools.bootstrap_install_from=egg100try:101importpkg_resources102exceptImportError:103returndo_download()104try:105pkg_resources.require("setuptools>="+version);return106exceptpkg_resources.VersionConflict,e:107ifwas_imported:108print>>sys.stderr,(109"The required version of setuptools (>=%s) is not available, and\n"110"can't be installed while this script is running. Please install\n"111" a more recent version first, using 'easy_install -U setuptools'."112"\n\n(Currently using %r)"113)%(version,e.args[0])114sys.exit(2)115else:116delpkg_resources,sys.modules['pkg_resources']# reload ok117returndo_download()118exceptpkg_resources.DistributionNotFound:119returndo_download()120121defdownload_setuptools(122version=DEFAULT_VERSION,download_base=DEFAULT_URL,to_dir=os.curdir,123delay=15124):125"""Download setuptools from a specified location and return its filename126127 `version` should be a valid setuptools version number that is available128 as an egg for download under the `download_base` URL (which should end129 with a '/'). `to_dir` is the directory where the egg will be downloaded.130 `delay` is the number of seconds to pause before an actual download attempt.131"""132importurllib2,shutil133egg_name="setuptools-%s-py%s.egg"%(version,sys.version[:3])134url=download_base+egg_name135saveto=os.path.join(to_dir,egg_name)136src=dst=None137ifnotos.path.exists(saveto):# Avoid repeated downloads138try:139fromdistutilsimportlog140ifdelay:141log.warn("""142---------------------------------------------------------------------------143This script requires setuptools version %s to run (even to display144help). I will attempt to download it for you (from145%s), but146you may need to enable firewall access for this script first.147I will start the download in %d seconds.148149(Note: if this machine does not have network access, please obtain the file150151%s152153and place it in this directory before rerunning this script.)154---------------------------------------------------------------------------""",155version,download_base,delay,url156);fromtimeimportsleep;sleep(delay)157log.warn("Downloading %s",url)158src=urllib2.urlopen(url)159# Read/write all in one block, so we don't create a corrupt file160# if the download is interrupted.161data=_validate_md5(egg_name,src.read())162dst=open(saveto,"wb");dst.write(data)163finally:164ifsrc:src.close()165ifdst:dst.close()166returnos.path.realpath(saveto)167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203defmain(argv,version=DEFAULT_VERSION):204"""Install or upgrade setuptools and EasyInstall"""205try:206importsetuptools207exceptImportError:208egg=None209try:210egg=download_setuptools(version,delay=0)211sys.path.insert(0,egg)212fromsetuptools.command.easy_installimportmain213returnmain(list(argv)+[egg])# we're done here214finally:215ifeggandos.path.exists(egg):216os.unlink(egg)217else:218ifsetuptools.__version__=='0.0.1':219print>>sys.stderr,(220"You have an obsolete version of setuptools installed. Please\n"221"remove it from your system entirely before rerunning this script."222)223sys.exit(2)224225req="setuptools>="+version226importpkg_resources227try:228pkg_resources.require(req)229exceptpkg_resources.VersionConflict:230try:231fromsetuptools.command.easy_installimportmain232exceptImportError:233fromeasy_installimportmain234main(list(argv)+[download_setuptools(delay=0)])235sys.exit(0)# try to force an exit236else:237ifargv:238fromsetuptools.command.easy_installimportmain239main(argv)240else:241print"Setuptools version",version,"or greater has been installed."242print'(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'243244defupdate_md5(filenames):245"""Update our built-in md5 registry"""246247importre248249fornameinfilenames:250base=os.path.basename(name)251f=open(name,'rb')252md5_data[base]=md5(f.read()).hexdigest()253f.close()254255data=["%r: %r,\n"%itforitinmd5_data.items()]256data.sort()257repl="".join(data)258259importinspect260srcfile=inspect.getsourcefile(sys.modules[__name__])261f=open(srcfile,'rb');src=f.read();f.close()262263match=re.search("\nmd5_data = {\n([^}]+)}",src)264ifnotmatch:265print>>sys.stderr,"Internal error!"266sys.exit(2)267268src=src[:match.start(1)]+repl+src[match.end(1):]269f=open(srcfile,'w')270f.write(src)271f.close()272273274if__name__=='__main__':275iflen(sys.argv)>2andsys.argv[1]=='--md5update':276update_md5(sys.argv[2:])277else:278main(sys.argv[1:])279280281282283284