Upgraded ez_setup.py from 0.5a12 to 0.6a5

git-svn-id: http://code.djangoproject.com/svn/django/trunk@873 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2005-10-14 22:38:59 +00:00
parent f575a4edaa
commit 67e6252a1e
1 changed files with 213 additions and 164 deletions

View File

@ -1,164 +1,213 @@
#!python #!python
"""Bootstrap setuptools installation """Bootstrap setuptools installation
If you want to use setuptools in your package's setup.py, just include this If you want to use setuptools in your package's setup.py, just include this
file in the same directory with it, and add this to the top of your setup.py:: file in the same directory with it, and add this to the top of your setup.py::
from ez_setup import use_setuptools from ez_setup import use_setuptools
use_setuptools() use_setuptools()
If you want to require a specific version of setuptools, set a download If you want to require a specific version of setuptools, set a download
mirror, or use an alternate download directory, you can do so by supplying mirror, or use an alternate download directory, you can do so by supplying
the appropriate options to ``use_setuptools()``. the appropriate options to ``use_setuptools()``.
This file can also be run as a script to install or upgrade setuptools. This file can also be run as a script to install or upgrade setuptools.
""" """
import sys
DEFAULT_VERSION = "0.5a12" DEFAULT_VERSION = "0.6a5"
DEFAULT_URL = "http://www.python.org/packages/source/s/setuptools/" DEFAULT_URL = "http://cheeseshop.python.org/packages/%s/s/setuptools/" % sys.version[:3]
import sys, os md5_data = {
'setuptools-0.5a13-py2.3.egg': '85edcf0ef39bab66e130d3f38f578c86',
'setuptools-0.5a13-py2.4.egg': 'ede4be600e3890e06d4ee5e0148e092a',
'setuptools-0.6a1-py2.3.egg': 'ee819a13b924d9696b0d6ca6d1c5833d',
'setuptools-0.6a1-py2.4.egg': '8256b5f1cd9e348ea6877b5ddd56257d',
'setuptools-0.6a2-py2.3.egg': 'b98da449da411267c37a738f0ab625ba',
'setuptools-0.6a2-py2.4.egg': 'be5b88bc30aed63fdefd2683be135c3b',
'setuptools-0.6a3-py2.3.egg': 'ee0e325de78f23aab79d33106dc2a8c8',
'setuptools-0.6a3-py2.4.egg': 'd95453d525a456d6c23e7a5eea89a063',
'setuptools-0.6a4-py2.3.egg': 'e958cbed4623bbf47dd1f268b99d7784',
'setuptools-0.6a4-py2.4.egg': '7f33c3ac2ef1296f0ab4fac1de4767d8',
'setuptools-0.6a5-py2.3.egg': '748408389c49bcd2d84f6ae0b01695b1',
'setuptools-0.6a5-py2.4.egg': '999bacde623f4284bfb3ea77941d2627',
}
import sys, os
def _validate_md5(egg_name, data):
if egg_name in md5_data:
from md5 import md5
digest = md5(data).hexdigest()
if digest != md5_data[egg_name]:
def use_setuptools( print >>sys.stderr, (
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir "md5 validation of %s failed! (Possible download problem?)"
): % egg_name
"""Automatically find/download setuptools and make it available on sys.path )
sys.exit(2)
`version` should be a valid setuptools version number that is available return data
as an egg for download under the `download_base` URL (which should end with
a '/'). `to_dir` is the directory where setuptools will be downloaded, if
it is not already available. def use_setuptools(
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
If an older version of setuptools is installed, this will print a message download_delay=15
to ``sys.stderr`` and raise SystemExit in an attempt to abort the calling ):
script. """Automatically find/download setuptools and make it available on sys.path
"""
try: `version` should be a valid setuptools version number that is available
import setuptools as an egg for download under the `download_base` URL (which should end with
if setuptools.__version__ == '0.0.1': a '/'). `to_dir` is the directory where setuptools will be downloaded, if
print >>sys.stderr, ( it is not already available. If `download_delay` is specified, it should
"You have an obsolete version of setuptools installed. Please\n" be the number of seconds that will be paused before initiating a download,
"remove it from your system entirely before rerunning this script." should one be required. If an older version of setuptools is installed,
) this routine will print a message to ``sys.stderr`` and raise SystemExit in
sys.exit(2) an attempt to abort the calling script.
"""
except ImportError: try:
egg = download_setuptools(version, download_base, to_dir) import setuptools
sys.path.insert(0, egg) if setuptools.__version__ == '0.0.1':
import setuptools; setuptools.bootstrap_install_from = egg print >>sys.stderr, (
"You have an obsolete version of setuptools installed. Please\n"
import pkg_resources "remove it from your system entirely before rerunning this script."
try: )
pkg_resources.require("setuptools>="+version) sys.exit(2)
except ImportError:
except pkg_resources.VersionConflict: egg = download_setuptools(version, download_base, to_dir, download_delay)
# XXX could we install in a subprocess here? sys.path.insert(0, egg)
print >>sys.stderr, ( import setuptools; setuptools.bootstrap_install_from = egg
"The required version of setuptools (>=%s) is not available, and\n"
"can't be installed while this script is running. Please install\n" import pkg_resources
" a more recent version first." try:
) % version pkg_resources.require("setuptools>="+version)
sys.exit(2)
except pkg_resources.VersionConflict:
def download_setuptools( # XXX could we install in a subprocess here?
version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir print >>sys.stderr, (
): "The required version of setuptools (>=%s) is not available, and\n"
"""Download setuptools from a specified location and return its filename "can't be installed while this script is running. Please install\n"
" a more recent version first."
`version` should be a valid setuptools version number that is available ) % version
as an egg for download under the `download_base` URL (which should end sys.exit(2)
with a '/'). `to_dir` is the directory where the egg will be downloaded.
""" def download_setuptools(
import urllib2, shutil version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) delay = 15
url = download_base + egg_name + '.zip' # XXX ):
saveto = os.path.join(to_dir, egg_name) """Download setuptools from a specified location and return its filename
src = dst = None
`version` should be a valid setuptools version number that is available
if not os.path.exists(saveto): # Avoid repeated downloads as an egg for download under the `download_base` URL (which should end
try: with a '/'). `to_dir` is the directory where the egg will be downloaded.
from distutils import log `delay` is the number of seconds to pause before an actual download attempt.
log.warn("Downloading %s", url) """
src = urllib2.urlopen(url) import urllib2, shutil
# Read/write all in one block, so we don't create a corrupt file egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
# if the download is interrupted. url = download_base + egg_name
data = src.read() saveto = os.path.join(to_dir, egg_name)
dst = open(saveto,"wb") src = dst = None
dst.write(data) if not os.path.exists(saveto): # Avoid repeated downloads
finally: try:
if src: src.close() from distutils import log
if dst: dst.close() if delay:
log.warn("""
return os.path.realpath(saveto) ---------------------------------------------------------------------------
This script requires setuptools version %s to run (even to display
help). I will attempt to download it for you (from
%s), but
you may need to enable firewall access for this script first.
I will start the download in %d seconds.
---------------------------------------------------------------------------""",
version, download_base, delay
); from time import sleep; sleep(delay)
log.warn("Downloading %s", url)
src = urllib2.urlopen(url)
# Read/write all in one block, so we don't create a corrupt file
def main(argv, version=DEFAULT_VERSION): # if the download is interrupted.
"""Install or upgrade setuptools and EasyInstall""" data = _validate_md5(egg_name, src.read())
dst = open(saveto,"wb"); dst.write(data)
try: finally:
import setuptools if src: src.close()
except ImportError: if dst: dst.close()
import tempfile, shutil return os.path.realpath(saveto)
tmpdir = tempfile.mkdtemp(prefix="easy_install-")
try: def main(argv, version=DEFAULT_VERSION):
egg = download_setuptools(version, to_dir=tmpdir) """Install or upgrade setuptools and EasyInstall"""
sys.path.insert(0,egg)
from setuptools.command.easy_install import main try:
main(list(argv)+[egg]) import setuptools
finally: except ImportError:
shutil.rmtree(tmpdir) import tempfile, shutil
else: tmpdir = tempfile.mkdtemp(prefix="easy_install-")
if setuptools.__version__ == '0.0.1': try:
# tell the user to uninstall obsolete version egg = download_setuptools(version, to_dir=tmpdir, delay=0)
use_setuptools(version) sys.path.insert(0,egg)
from setuptools.command.easy_install import main
req = "setuptools>="+version main(list(argv)+[egg])
import pkg_resources finally:
try: shutil.rmtree(tmpdir)
pkg_resources.require(req) else:
except pkg_resources.VersionConflict: if setuptools.__version__ == '0.0.1':
try: # tell the user to uninstall obsolete version
from setuptools.command.easy_install import main use_setuptools(version)
except ImportError:
from easy_install import main req = "setuptools>="+version
main(list(argv)+[download_setuptools()]) import pkg_resources
sys.exit(0) # try to force an exit try:
else: pkg_resources.require(req)
if argv: except pkg_resources.VersionConflict:
from setuptools.command.easy_install import main try:
main(argv) from setuptools.command.easy_install import main
else: except ImportError:
print "Setuptools version",version,"or greater has been installed." from easy_install import main
print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' main(list(argv)+[download_setuptools(delay=0)])
if __name__=='__main__': sys.exit(0) # try to force an exit
main(sys.argv[1:]) else:
if argv:
from setuptools.command.easy_install import main
main(argv)
else:
print "Setuptools version",version,"or greater has been installed."
print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
def update_md5(filenames):
"""Update our built-in md5 registry"""
import re
from md5 import md5
for name in filenames:
base = os.path.basename(name)
f = open(name,'rb')
md5_data[base] = md5(f.read()).hexdigest()
f.close()
data = [" %r: %r,\n" % it for it in md5_data.items()]
data.sort()
repl = "".join(data)
import inspect
srcfile = inspect.getsourcefile(sys.modules[__name__])
f = open(srcfile, 'rb'); src = f.read(); f.close()
match = re.search("\nmd5_data = {\n([^}]+)}", src)
if not match:
print >>sys.stderr, "Internal error!"
sys.exit(2)
src = src[:match.start(1)] + repl + src[match.end(1):]
f = open(srcfile,'w')
f.write(src)
f.close()
if __name__=='__main__':
if len(sys.argv)>2 and sys.argv[1]=='--md5update':
update_md5(sys.argv[2:])
else:
main(sys.argv[1:])