setup: upgrade to my hacked version of ez_setup.py
authorzooko <zooko@zooko.com>
Mon, 5 Jan 2009 20:17:19 +0000 (01:47 +0530)
committerzooko <zooko@zooko.com>
Mon, 5 Jan 2009 20:17:19 +0000 (01:47 +0530)
Ignore-this: e6d70e416a8b32e487d664fceb8d417e

darcs-hash:7c9dc94cfc43702d7e2a2b616a789c54af71c2a8

zfec/ez_setup.py

index 537a450721a89fc7155de1319472dbd226b20903..612df1e25d00a1c604052ef2fc0a31fff1dd9ce6 100755 (executable)
@@ -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:])
+
+
+
+
+