setup: copy in the latest version of ez_setup.py, which works even if setuptools...
authorZooko O'Whielacronx <zooko@zooko.com>
Sat, 22 Dec 2007 06:26:20 +0000 (23:26 -0700)
committerZooko O'Whielacronx <zooko@zooko.com>
Sat, 22 Dec 2007 06:26:20 +0000 (23:26 -0700)
This actually happens in practice -- this fixes the Desert Island scenario.  Thanks to PJE.

ez_setup.py

index 02b9caa56ac63656950a134b1ccb1ea543bda1cd..6dd60f947f08f1f72748d404668ba740776ef74d 100644 (file)
@@ -68,10 +68,33 @@ def parse_version(s):
 def setuptools_is_new_enough(required_version):
     """Return True if setuptools is already installed and has a version
     number >= required_version."""
-    (cin, cout, cerr,) = os.popen3("%s -c \"import setuptools;print setuptools.__version__\"" % (sys.executable,))
-    verstr = cout.read().strip()
-    ver = parse_version(verstr)
-    return ver and ver >= parse_version(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,
@@ -91,12 +114,12 @@ def use_setuptools(
     if min_version is None:
         min_version = version
     if not setuptools_is_new_enough(min_version):
-        egg = download_setuptools(version, download_base, to_dir, download_delay)
+        egg = download_setuptools(version, min_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, min_version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
     delay = 15
 ):
     """Download setuptools from a specified location and return its filename
@@ -117,8 +140,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 it for you (from
+This script requires setuptools version >= %s to run (even to display
+help).  I will attempt to download setuptools for you (from
 %s), but
 you may need to enable firewall access for this script first.
 I will start the download in %d seconds.
@@ -129,7 +152,7 @@ I will start the download in %d seconds.
 
 and place it in this directory before rerunning this script.)
 ---------------------------------------------------------------------------""",
-                    version, download_base, delay, url
+                    min_version, download_base, delay, url
                 ); from time import sleep; sleep(delay)
             log.warn("Downloading %s", url)
             src = urllib2.urlopen(url)
@@ -155,7 +178,7 @@ def main(argv, version=DEFAULT_VERSION):
     else:
         egg = None
         try:
-            egg = download_setuptools(version, delay=0)
+            egg = download_setuptools(version, min_version=version, delay=0)
             sys.path.insert(0,egg)
             from setuptools.command.easy_install import main
             return main(list(argv)+[egg])   # we're done here