[Checkins] SVN: zc.buildout/trunk/ Merged -r105475:105584 svn+ssh://reinout at svn.zope.org/repos/main/zc.buildout/branches/reinout_distribute_upgrade_check
Reinout van Rees
reinout at vanrees.org
Wed Nov 11 16:21:12 EST 2009
Log message for revision 105585:
Merged -r105475:105584 svn+ssh://reinout@svn.zope.org/repos/main/zc.buildout/branches/reinout_distribute_upgrade_check
This is the fix for an infinite recursion when updating Distribute.
Solved by using the available setuptools/distribute for easy_installing the Distribute tgz instead of searching for it, which tries to install, which searches...
Changed:
U zc.buildout/trunk/CHANGES.txt
U zc.buildout/trunk/src/zc/buildout/easy_install.py
U zc.buildout/trunk/src/zc/buildout/easy_install.txt
U zc.buildout/trunk/src/zc/buildout/tests.py
A zc.buildout/trunk/src/zc/buildout/upgrading_distribute.txt
-=-
Modified: zc.buildout/trunk/CHANGES.txt
===================================================================
--- zc.buildout/trunk/CHANGES.txt 2009-11-11 14:50:00 UTC (rev 105584)
+++ zc.buildout/trunk/CHANGES.txt 2009-11-11 21:21:11 UTC (rev 105585)
@@ -4,7 +4,13 @@
1.4.3 (?)
=========
+Bugs fixed:
+- Using pre-detected setuptools version for easy_installing tgz files. This
+ prevents a recursion error when easy_installing an upgraded "distribute"
+ tgz. Note that setuptools did not have this recursion problem solely
+ because it was packaged as an ``.egg``, which does not have to go through
+ the easy_install step.
1.4.2 (2009-11-01)
Modified: zc.buildout/trunk/src/zc/buildout/easy_install.py
===================================================================
--- zc.buildout/trunk/src/zc/buildout/easy_install.py 2009-11-11 14:50:00 UTC (rev 105584)
+++ zc.buildout/trunk/src/zc/buildout/easy_install.py 2009-11-11 21:21:11 UTC (rev 105585)
@@ -299,10 +299,7 @@
tmp = tempfile.mkdtemp(dir=dest)
try:
- path = self._get_dist(
- self._constrain(pkg_resources.Requirement.parse('setuptools')),
- ws, False,
- )[0].location
+ path = setuptools_loc
args = ('-c', _easy_install_cmd, '-mUNxd', _safe_arg(tmp))
if self._always_unzip:
Modified: zc.buildout/trunk/src/zc/buildout/easy_install.txt
===================================================================
--- zc.buildout/trunk/src/zc/buildout/easy_install.txt 2009-11-11 14:50:00 UTC (rev 105584)
+++ zc.buildout/trunk/src/zc/buildout/easy_install.txt 2009-11-11 21:21:11 UTC (rev 105585)
@@ -1208,7 +1208,6 @@
GET 200 /demo-0.2-py2.4.egg
GET 404 /index/demoneeded/
GET 200 /demoneeded-1.1.zip
- GET 404 /index/setuptools/
>>> zc.buildout.easy_install.build(
... 'extdemo', dest,
@@ -1251,7 +1250,6 @@
GET 404 /index/demo/
GET 200 /index/
GET 404 /index/demoneeded/
- GET 404 /index/setuptools/
>>> zc.buildout.easy_install.build(
... 'extdemo', dest,
Modified: zc.buildout/trunk/src/zc/buildout/tests.py
===================================================================
--- zc.buildout/trunk/src/zc/buildout/tests.py 2009-11-11 14:50:00 UTC (rev 105584)
+++ zc.buildout/trunk/src/zc/buildout/tests.py 2009-11-11 21:21:11 UTC (rev 105585)
@@ -2921,7 +2921,7 @@
doctest.DocFileSuite(
'easy_install.txt', 'downloadcache.txt', 'dependencylinks.txt',
- 'allowhosts.txt', 'unzip.txt',
+ 'allowhosts.txt', 'unzip.txt', 'upgrading_distribute.txt',
setUp=easy_install_SetUp,
tearDown=zc.buildout.testing.buildoutTearDown,
checker=renormalizing.RENormalizing([
Copied: zc.buildout/trunk/src/zc/buildout/upgrading_distribute.txt (from rev 105584, zc.buildout/branches/reinout_distribute_upgrade_check/src/zc/buildout/upgrading_distribute.txt)
===================================================================
--- zc.buildout/trunk/src/zc/buildout/upgrading_distribute.txt (rev 0)
+++ zc.buildout/trunk/src/zc/buildout/upgrading_distribute.txt 2009-11-11 21:21:11 UTC (rev 105585)
@@ -0,0 +1,42 @@
+Installing setuptools/distribute
+--------------------------------
+
+Some initial test setup:
+
+ >>> import sys
+ >>> import zc.buildout.easy_install
+ >>> dest = tmpdir('sample-install')
+
+Setuptools (0.6something) is packaged as an ``.egg``. So when installing it,
+the egg is downloaded and used. Distribute is packaged as a tarball, which
+makes an easy_install call necessary. In older versions of buildout, the
+``_call_easy_install()`` method would call ``_get_dist()`` to get hold of the
+setuptools path for calling easy_install. When an updated "distribute" was
+found, this would try an install again, leading to an infinite recursion.
+
+The solution is to just use the setuptools location found at import time, like
+happens with the buildout and setuptools location that is inserted in scripts'
+paths.
+
+We test this corner case by patching the ``_get_dist()`` call:
+
+ >>> def mock_get_dist(requirement, ws, always_unzip):
+ ... raise RuntimeError("We should not get called")
+
+When installing setuptools itself, we expect the "Getting dist" message not to
+be printed. We call ``_call_easy_install()`` directly and get an error
+because of a non-existing tarball, but that's the OK for this corner case
+test: we only want to test that ``_get_dist()`` isn't getting called:
+
+ >>> installer = zc.buildout.easy_install.Installer(
+ ... dest=dest,
+ ... links=[link_server],
+ ... index=link_server+'index/',
+ ... executable=sys.executable,
+ ... always_unzip=True)
+ >>> installer._get_dist = mock_get_dist
+ >>> installer._call_easy_install('setuptools', None, dest,
+ ... 'nonexisting.tgz')
+ Traceback (most recent call last):
+ ...
+ UserError: Couldn't install: nonexisting.tgz
More information about the checkins
mailing list