For a while now we’ve been getting the following errors on one of our sites:
WARNING GenericSetup There are unresolved or circular dependencies. Graphviz diagram:: digraph dependencies {"typeinfo" -> "toolset"; "tinymce_settings" -> "componentregistry"; "transmogrifier" -> "toolset"; "kss_mimetype" -> "mimetypes-registry-various"; "pleonformgen" -> "toolset"; "pleonformgen" -> "propertiestool"; "pleonformgen" -> "typeinfo"; "atcttool" -> "catalog"; "atcttool" -> "componentregistry"; "actions" -> "componentregistry"; [snip]
Apparently they are not harmful so I let them be for a while. But yesterday, while upgrading to Plone 4.2b2, it was time to track down the source of these errors and hopefully fix them.
I started by downloading GraphViz to vizualize the dependency diagram reported by GenericSetup. After I had it installed it was time to create a .dot file that I could feed into GraphViz. I did that by creating an empty file, adding strict digraph G to the first line, followed by whatever GS outputted in curly braces:
strict digraph G {"typeinfo" -> "toolset"; "tinymce_settings" -> "componentregistry"; "transmogrifier" -> "toolset"; "kss_mimetype" -> "mimetypes-registry-various"; "pleonformgen" -> "toolset"; "pleonformgen" -> "propertiestool"; "pleonformgen" -> "typeinfo"; "atcttool" -> "catalog"; "atcttool" -> "componentregistry"; "actions" -> "componentregistry"; [snip]
Opening my graph.dot in GraphViz I was presented with the following diagram, showing two unresolved dependencies: plonepas and collective.prettyphoto.
I started with collective.prettyphoto as it’s an add-on and probably easier to fix than Plone Core. After some research I found out that this issue was already fixed by Ross Patterson. Pinning collective.prettyphoto to the latest release, 0.4.4, indeed fixed the problem:
Moving on to the remaining issue: plonepas. I first wanted to check whether this issue is relevant just to my site or is it a general Plone bug. I created a vanilla Plone instance, tried installing some add-ons and everything was OK, no errors. Apparently it was something in the state of my site that was broken.
Glancing through the long discussion on Trac about these issues I dediced to dig deeper. Using the following (ugly) one-liner I got the list of dependencies for plonepas as set in my portal_setup:
>>> [i for i in self.context.portal_setup.getImportStepRegistry(), _import_step_registry][0]._registered['plonepas']['dependencies'] (u'componentregistry', u'controlpanel', u'memberdata-properties', u'plonepas-contents', u'rolemap')
Hmm, that plonepas-content seemed suspicious as it was already reported as non-existent step. Looking at Products.PlonePAS-4.0.11 (that comes with Plone 4.2b2) and its configure.zcml,depenedencies should be the following:
- componentregistry
- controlpanel
- memberdata-properties
- rolemap
Time to remove that plonepas-content from the dependencies list! I used the following migration script to take care of it:
def fix_plonepas_dependencies(setup_tool): """Remove 'plonepas-content' as a dependency for 'plonepas' GS profile.""" from Products.GenericSetup.registry import _import_step_registry for registry in setup_tool.getImportStepRegistry(), _import_step_registry: registry._registered.get('plonepas')['dependencies'] = \ (u'componentregistry', u'memberdata-properties', u'rolemap', u'controlpanel')
And that’s it! We no longer get unresolved dependencies errors when (re)installing add-ons or doing upgrades. Yay!