From: Zooko O'Whielacronx Date: Wed, 3 Oct 2007 22:13:19 +0000 (-0700) Subject: setup: import the latest version of ez_setup.py with my patches X-Git-Tag: allmydata-tahoe-0.6.1~64 X-Git-Url: https://git.rkrishnan.org/components/%22news.html/...?a=commitdiff_plain;h=3deff4b46c3f569ed9e927d2136e84f38ca0eed9;p=tahoe-lafs%2Ftahoe-lafs.git setup: import the latest version of ez_setup.py with my patches --- diff --git a/ez_setup.py b/ez_setup.py index 48dc2983..d7c4e5e8 100644 --- a/ez_setup.py +++ b/ez_setup.py @@ -13,8 +13,7 @@ the appropriate options to ``use_setuptools()``. This file can also be run as a script to install or upgrade setuptools. """ -import sys - +import subprocess, sys DEFAULT_VERSION = "0.6c7" DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] @@ -38,55 +37,69 @@ def _validate_md5(egg_name, data): sys.exit(2) return data +def setuptools_is_loaded(): + return 'pkg_resources' in sys.modules or 'setuptools' in sys.modules + +def get_setuptools_version(): + sub = subprocess.Popen([sys.executable, "-c", "import setuptools;print setuptools.__version__"], stdout=subprocess.PIPE) + return sub.stdout.read().strip() + +def setuptools_is_new_enough(required_version): + """Return True if setuptools is already installed and has a version + number >= required_version.""" + verstr = get_setuptools_version() + import pkg_resources + try: + ver = pkg_resources.parse_version(verstr) + newenough = ver and ver >= pkg_resources.parse_version(required_version) + finally: + del sys.modules['pkg_resources'] + return newenough def use_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, min_version=None + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + min_version=None, download_delay=15 ): """Automatically find/download setuptools and make it available on sys.path `version` should be a valid setuptools version number that is available 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. If an older version of setuptools is installed, + it is not already available. If `download_delay` is specified, it should + be the number of seconds that will be paused before initiating a download, + 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 an attempt to abort the calling script. """ - try: - import setuptools - if setuptools.__version__ == '0.0.1': + if min_version is None: + min_version = version + if setuptools_is_loaded(): + # setuptools is installed, but can't be upgraded, so just version + # check (using pkg_resources) and exit if it's not a good enough + # version. + if not setuptools_is_new_enough(min_version): print >>sys.stderr, ( - "You have an obsolete version of setuptools installed. Please\n" - "remove it from your system entirely before rerunning this script." - ) - sys.exit(2) - except ImportError: - egg = download_setuptools(version, download_base, to_dir) - sys.path.insert(0, egg) - import setuptools; setuptools.bootstrap_install_from = egg - - import pkg_resources - try: - if not min_version: - min_version = version - pkg_resources.require("setuptools>="+min_version) - - except pkg_resources.VersionConflict, e: - # XXX could we install in a subprocess here? - print >>sys.stderr, ( - "The required version of setuptools (>=%s) is not available, and\n" + "The required version of setuptools (>=%s) is not installed, and\n" "can't be installed while this script is running. Please install\n" - " a more recent version first.\n\n(Currently using %r)" - ) % (min_version, e.args[0]) - sys.exit(2) + "a more recent version first.\n\n(Currently using %r)" + ) % (min_version, get_setuptools_version()) + sys.exit(2) + else: + if not setuptools_is_new_enough(min_version): + egg = download_setuptools(version, download_base, to_dir, download_delay) + sys.path.insert(0, egg) + import setuptools; setuptools.bootstrap_install_from = egg def download_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + delay = 15 ): """Download setuptools from a specified location and return its filename `version` should be a valid setuptools version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download attempt. """ import urllib2, shutil egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) @@ -96,15 +109,14 @@ def download_setuptools( if not os.path.exists(saveto): # Avoid repeated downloads try: from distutils import log - if download_base.startswith("file:"): - log.warn("Unpacking %s", url) - else: + if delay: log.warn(""" --------------------------------------------------------------------------- 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. (Note: if this machine does not have network access, please obtain the file @@ -112,9 +124,9 @@ you may need to enable firewall access for this script first. and place it in this directory before rerunning this script.) ---------------------------------------------------------------------------""", - version, download_base, url - ); - log.warn("Downloading %s", url) + version, download_base, delay, url + ); 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 # if the download is interrupted. @@ -128,43 +140,35 @@ and place it in this directory before rerunning this script.) def main(argv, version=DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall""" - try: - import setuptools - except ImportError: - egg = None - try: - egg = download_setuptools(version) - sys.path.insert(0,egg) - from setuptools.command.easy_install import main - return main(list(argv)+[egg]) # we're done here - finally: - if egg and os.path.exists(egg): - os.unlink(egg) - else: - if setuptools.__version__ == '0.0.1': - # tell the user to uninstall obsolete version - use_setuptools(version) - - req = "setuptools>="+version - import pkg_resources - try: - pkg_resources.require(req) - except pkg_resources.VersionConflict: - try: - from setuptools.command.easy_install import main - except ImportError: - from easy_install import main - main(list(argv)+[download_setuptools()]) - sys.exit(0) # try to force an exit + if setuptools_is_loaded(): + # setuptools is installed, but can't be upgraded, so just version + # check (using pkg_resources) and exit if it's not a good enough + # version. + if not setuptools_is_new_enough(version): + print >>sys.stderr, ( + "The required version of setuptools (>=%s) is not installed, and\n" + "can't be installed while this script is running. Please install\n" + "a more recent version first.\n\n(Currently using %r)" + ) % (version, get_setuptools_version()) + sys.exit(2) else: - if argv: - from setuptools.command.easy_install import main - main(argv) + if setuptools_is_new_enough(version): + 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.)' else: - print "Setuptools version",version,"or greater has been installed." - print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' - - + egg = None + try: + egg = download_setuptools(version, delay=0) + sys.path.insert(0,egg) + from setuptools.command.easy_install import main + return main(list(argv)+[egg]) # we're done here + finally: + if egg and os.path.exists(egg): + os.unlink(egg) def update_md5(filenames): """Update our built-in md5 registry""" @@ -198,12 +202,8 @@ def update_md5(filenames): if __name__=='__main__': - if len(sys.argv)>2 and sys.argv[1]=='--md5update': - update_md5(sys.argv[2:]) + if '--md5update' in sys.argv[1]: + sys.argv.remove('--md5update') + update_md5(sys.argv[1:]) else: main(sys.argv[1:]) - - - - -