We are seeing a very interesting problem with the current profile
handling in GenericSetup. This is the scenario:

- we load a profile using runAllImportStepsFromProfile
- one of the import steps installs a product using CMFQuickInstaller
- this product loads another GenericSetup profile, but does a
  getImportContextID() and setImportContext() to make sure GS context
  is not destroyed during the process.

what happens is that runAllImportStepsFromProfile does not set
_import_context_id on the setup tool, so we get the default value: an
empty string. setImportContext() checks if the context id starts with
profile- and if not assumes we are setting the base profile. Result:
the base profile has disappeared.

What surprised me was that apparently "" *is* a valid profile id:
_getImportContext assumes that anything that does not start with
profile- is a snapshot profile. But it will also destroy the context
id in that scenario:

    # else snapshot
    context_id = context_id[len('snapshot-'):]

I modified that code to explicitly check for
context_id.startswith("snapshot-") (see patch below) but that broke a
number of tests which were using an context id of "" to get an empty
snapshot context.  As far as I can see nobody does that outside of the
tests so there should no risk of unexpected breakage anywhere.

Does anyone have a good reason not to make this change?

Wichert.



Index: tests/test_tool.py
===================================================================
--- tests/test_tool.py  (revision 81908)
+++ tests/test_tool.py  (working copy)
@@ -141,6 +141,15 @@
                          , 'profile-foo'
                          )
 
+    def test_setBaselineContext_empty_string( self ):
+
+        tool = self._makeOne('setup_tool')
+
+        self.assertRaises( KeyError
+                         , tool.setBaselineContext
+                         , ''
+                         )
+
     def test_setBaselineContext( self ):
 
         from Products.GenericSetup.tool import IMPORT_STEPS_XML
Index: CHANGES.txt
===================================================================
--- CHANGES.txt (revision 81908)
+++ CHANGES.txt (working copy)
@@ -2,6 +2,8 @@
 
   GenericSetup 1.4 (unreleased)
   
+    - Be more careful in checking context id validity.
+
     - Fire events before and after importing.
 
     - Use zcml to register import and export steps.
Index: tool.py
===================================================================
--- tool.py     (revision 81908)
+++ tool.py     (working copy)
@@ -954,11 +954,13 @@
                 should_purge = (info.get('type') != EXTENSION)
             return DirectoryImportContext(self, path, should_purge, encoding)
 
-        # else snapshot
-        context_id = context_id[len('snapshot-'):]
-        if should_purge is None:
-            should_purge = True
-        return SnapshotImportContext(self, context_id, should_purge, encoding)
+        elif context_id.startswith('snapshot-'):
+            context_id = context_id[len('snapshot-'):]
+            if should_purge is None:
+                should_purge = True
+            return SnapshotImportContext(self, context_id, should_purge, 
encoding)
+        else:
+            raise KeyError, 'Unknown context %s' % context_id
 
     security.declarePrivate('_updateImportStepsRegistry')
     def _updateImportStepsRegistry(self, context, encoding):

-- 
Wichert Akkerman <[EMAIL PROTECTED]>    It is simple to make things.
http://www.wiggy.net/                   It is hard to make things simple.
_______________________________________________
Zope-CMF maillist  -  Zope-CMF@lists.zope.org
http://mail.zope.org/mailman/listinfo/zope-cmf

See http://collector.zope.org/CMF for bug reports and feature requests

Reply via email to