Tracing and fixing Python buildout version conflicts and dependencies

Sometimes running buildout for Plone and it ends up like this:

bin/buildout -vvv
Getting required 'zope.testing==3.8.1'
We have the distribution that satisfies 'zope.testing==3.8.1'.
Getting required 'zope.event'
  required by z3c.widgets.flashupload 1.0c1.
  required by plone.registry 1.0.
  required by z3c.form 2.2.0.
  required by zope.component 3.4.0.
We have a develop egg: zope.event 0.0
Getting required 'zope.dottedname'
  required by plone.registry 1.0.
  required by plone.app.registry 1.2.
We have a develop egg: zope.dottedname 0.0
Getting required 'zope.schema==3.4.0'
We have the distribution that satisfies 'zope.schema==3.4.0'.
Getting required 'ZODB3==3.8.4'
We have the distribution that satisfies 'ZODB3==3.8.4'.
Getting required 'zope.i18nmessageid'
  required by z3c.formwidget.query 0.5.
  required by plone.directives.form 1.0b6.
  required by z3c.widgets.flashupload 1.0c1.
  required by plone.app.registry 1.2.
  required by z3c.form 2.2.0.
  required by zope.schema 3.4.0.
We have a develop egg: zope.i18nmessageid 0.0
Getting required 'Products.statusmessages==3.0.3'
We have the distribution that satisfies 'Products.statusmessages==3.0.3'.
Getting required 'Products.CMFPlone==4.0b1'
We have the distribution that satisfies 'Products.CMFPlone==4.0b1'.
Getting required 'plone.autoform==1.0b2'
We have the distribution that satisfies 'plone.autoform==1.0b2'.
The version, 1.0b4, is not consistent with the requirement, 'plone.supermodel>=1.1dev'.
While:
  Installing instance.
Error: Bad version 1.0b4
*********************************************
Overwriting versions.cfg

It means that a package has dependencies which other packages in buildout configuration pin down to an incompatible, older versions. Usually the package which declares too new dependencies is not itself pinned down – you’ll automatically get the latest version from PyPi package repository. The solution is to figure out which of your automatically pulled in packages is one that is “too new”.

Based on this output it is almost impossible to figure out where is a version conflict and what package you have is requiring too new versions. This is especially true for old Plone 3.3.x buildout configurations.

However this little UNIX grep search might help you. It goes through all eggs requires.txt files which declare package dependencies in installed (thus far) eggs folder. EGG-INFO is a metadata folder found inside Python eggs – it contents is generated from setup.py when you release your egg for the distribution on PyPi. We will look for CMFPlone which is too new based on bin/buildout -vvv output (it says 4.x even though this buildout configuration is for Plone 3.x):

# The actual location of eggs/ folder depends on your installation
grep -Ri --include="requires.txt" "CMFPlone" eggs/*
eggs/plone.app.registry-1.2-py2.7.egg/EGG-INFO/requires.txt:Products.CMFPlone

Looks like the culprit in our case is plone.app.registry.

(More power grep techniques)

Then you can go to plone.app.registry PyPi page. Look for a version which seems to be “old enough”.

Then pin down it in buildout.cfg:

eggs =
    ...
    plone.app.registry==1.0.1

… and your buildout happily churns forward again.

\"\" Subscribe to RSS feed Follow me on Twitter Follow me on Facebook Follow me Google+

Leave a Reply

Your email address will not be published. Required fields are marked *