From: zooko Date: Mon, 5 Jan 2009 20:17:19 +0000 (+0530) Subject: setup: upgrade to my hacked version of ez_setup.py X-Git-Url: https://git.rkrishnan.org/pf/content?a=commitdiff_plain;h=8299797203823f1ee129678cbb13e9b9a05317a3;p=tahoe-lafs%2Fzfec.git setup: upgrade to my hacked version of ez_setup.py Ignore-this: e6d70e416a8b32e487d664fceb8d417e darcs-hash:7c9dc94cfc43702d7e2a2b616a789c54af71c2a8 --- diff --git a/zfec/ez_setup.py b/zfec/ez_setup.py index 537a450..612df1e 100755 --- a/zfec/ez_setup.py +++ b/zfec/ez_setup.py @@ -14,13 +14,16 @@ the appropriate options to ``use_setuptools()``. This file can also be run as a script to install or upgrade setuptools. """ import os, sys -DEFAULT_VERSION = "0.6c7" -DEFAULT_URL = "file:misc/dependencies/" +DEFAULT_VERSION = "0.6c10dev" +DEFAULT_DIR = "misc/dependencies/" +DEFAULT_URL = "file:"+DEFAULT_DIR md5_data = { - 'setuptools-0.6c7.egg': 'ab87e88b800ad71d5235826b37acdbb1', + 'setuptools-0.6c10dev.egg': 'caa2735c28de4361dbfbdbf1a1bbc87a', } +import sys, os + def _validate_md5(egg_name, data): if egg_name in md5_data: from md5 import md5 @@ -33,91 +36,56 @@ def _validate_md5(egg_name, data): sys.exit(2) return data -# The following code to parse versions is copied from pkg_resources.py so that -# we can parse versions without importing that module. -import re -component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) -replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get - -def _parse_version_parts(s): - for part in component_re.split(s): - part = replace(part,part) - if not part or part=='.': - continue - if part[:1] in '0123456789': - yield part.zfill(8) # pad for numeric comparison - else: - yield '*'+part - - yield '*final' # ensure that alpha/beta/candidate are before final - -def parse_version(s): - parts = [] - for part in _parse_version_parts(s.lower()): - if part.startswith('*'): - if part<'*final': # remove '-' before a prerelease tag - while parts and parts[-1]=='*final-': parts.pop() - # remove trailing zeros from each series of numeric parts - while parts and parts[-1]=='00000000': - parts.pop() - parts.append(part) - return tuple(parts) - -def setuptools_is_new_enough(required_version): - """Return True if setuptools is already installed and has a version - number >= required_version.""" - if 'pkg_resources' in sys.modules: - import pkg_resources - try: - pkg_resources.require('setuptools >= %s' % (required_version,)) - except pkg_resources.VersionConflict: - # An insufficiently new version is installed. - return False - else: - return True - else: - try: - import pkg_resources - except ImportError: - # Okay it is not installed. - return False - else: - try: - pkg_resources.require('setuptools >= %s' % (required_version,)) - except pkg_resources.VersionConflict: - # An insufficiently new version is installed. - pkg_resources.__dict__.clear() # "If you want to be absolutely sure... before deleting it." --said PJE on IRC - del sys.modules['pkg_resources'] - return False - else: - pkg_resources.__dict__.clear() # "If you want to be absolutely sure... before deleting it." --said PJE on IRC - del sys.modules['pkg_resources'] - return True def use_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - min_version=None, download_delay=15 + min_version="0.6c10dev", 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 `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. + `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 `download_delay` is specified, it is the + number of seconds that will be paused before initiating a download, should + one be required. If an older version of setuptools is installed but hasn't + been imported yet, this routine will go ahead and install the required + version and then use it. If an older version of setuptools has already been + imported then we can't upgrade to the new one, so this routine will print a + message to ``sys.stderr`` and raise SystemExit in an attempt to abort the + calling script. """ if min_version is None: min_version = version - if not setuptools_is_new_enough(min_version): - egg = download_setuptools(version, min_version, download_base, to_dir, download_delay) + + was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules + def do_download(): + egg = download_setuptools(version, download_base, to_dir, download_delay) sys.path.insert(0, egg) import setuptools; setuptools.bootstrap_install_from = egg + try: + import pkg_resources + except ImportError: + return do_download() + try: + pkg_resources.require("setuptools>="+min_version); return + except pkg_resources.VersionConflict, e: + if was_imported: + print >>sys.stderr, ( + "The required version of setuptools (>=%s) is not available, and\n" + "can't be installed while this script is running. Please install\n" + " a more recent version first, using 'easy_install -U setuptools'." + "\n\n(Currently using %r)" + ) % (min_version, e.args[0]) + sys.exit(2) + else: + del pkg_resources, sys.modules['pkg_resources'] # reload ok + return do_download() + except pkg_resources.DistributionNotFound: + return do_download() def download_setuptools( - version=DEFAULT_VERSION, min_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 @@ -138,8 +106,8 @@ def download_setuptools( if delay: log.warn(""" --------------------------------------------------------------------------- -This script requires setuptools version >= %s to run (even to display -help). I will attempt to download setuptools for you (from +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. @@ -150,7 +118,7 @@ I will start the download in %d seconds. and place it in this directory before rerunning this script.) ---------------------------------------------------------------------------""", - min_version, download_base, delay, url + version, download_base, delay, url ); from time import sleep; sleep(delay) log.warn("Downloading %s", url) src = urllib2.urlopen(url) @@ -163,26 +131,81 @@ and place it in this directory before rerunning this script.) if dst: dst.close() return os.path.realpath(saveto) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + def main(argv, version=DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall""" - - 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: + try: + import setuptools + except ImportError: egg = None try: - egg = download_setuptools(version, min_version=version, delay=0) + 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) + else: + if setuptools.__version__ == '0.0.1': + 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) + + 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(delay=0)]) + sys.exit(0) # try to force an exit + 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""" @@ -216,8 +239,12 @@ def update_md5(filenames): if __name__=='__main__': - if '--md5update' in sys.argv: - sys.argv.remove('--md5update') - update_md5(sys.argv[1:]) + if len(sys.argv)>2 and sys.argv[1]=='--md5update': + update_md5(sys.argv[2:]) else: main(sys.argv[1:]) + + + + +