[Zope-CMF] GenericSetup: Apply profile dependencies only once

Maurits van Rees m.van.rees at zestsoftware.nl
Mon Sep 28 17:17:05 CEST 2015


Hi yuppie,

Op 25-09-15 om 10:31 schreef yuppie:
> Hi Maurits,
>
> Maurits van Rees wrote:
>> Op 24-09-15 om 13:54 schreef yuppie:
>>> if you run a base profile in purge mode, you usually want to undo all
>>> previous configuration and start from scratch. In theory you could do
>>> that just with some setup handlers and keep the rest of the
>>> configuration. But I doubt someone uses it that way.
>>>
>>> If you start from scratch, old profile versions data becomes incorrect.
>>> So I think GenericSetup should delete that data automatically.
>>
>> I have updated my pull request to add that purgeProfileVersions method
>> and to run this before running the import steps of a base profile.
>>
>> See https://github.com/zopefoundation/Products.GenericSetup/pull/18
>
> it looks a bit strange to have that new code inside the loop because
> versions should only be purged once before applying the first profile in
> the chain.
>
> But I hope these assertions are true:
>
> - a profile that depends on more than one base profile is broken anyway

Agreed.

> - if there is a base profile in the chain, it is always the first in the
> chain

Not necessarily, though I do hope so.

I am expecting that the base profile is the first and only profile in 
the chain.

But in the tests I explicitly test what would happen if the base profile 
itself has a dependency, although this makes no sense to me.  In this 
case the base profile would be the second in the chain.  Then the purge 
of all versions should happen right before applying the base profile, so 
after its dependency profile.

> So it might be ok to purge versions inside the loop. But I don't think
> it makes sense to purge versions if we don't reapply the base profile in
> purge mode. I would make the change after the BeforeProfileImportEvent.

Problem may then be that this part of the code is never reached. 
Between those two spots are the checks to see whether the profile that 
is about to be imported has already been applied previously.  And we use 
the profile upgrade versions for this.  When a base profile is in this 
way applied a second time, the checks would conclude it has already been 
applied and will continue with the next profile in the for loop, without 
purging the versions.

> In that place it should be possible to use the shouldPurge method
> instead of checking the profile type. Or is anyone running extension
> profiles in purge mode? In that case we have to check for both.

Let me think.

We have this method:

     def _getImportContext(self, context_id, should_purge=None, 
archive=None)

In all cases, if should_purge is explicitly set to True or False, that 
value wins.  In case it is None, you get this:

- tarballs/archives: should_purge = False
- snapshots: should_purge = True
- base/extension profiles: should_purge = (info.get('type') != EXTENSION)

For tarballs and snapshots I don't think we should purge the profile 
upgrade versions, but those kinds of profiles do not enter in the loop 
we are currently discussing.

For a BASE profile, the pull request currently always purges the profile 
upgrade versions.  It is probably good to not do this when someone 
explicitly calls the method with purge_old=False.

For an EXTENSION profile, the pull request currently does not purge the 
profile upgrade versions.  We could purge it when someone explicitly 
calls the method with purge_old=True.  But I am guessing this is not 
what people expect.  The use case for explicitly applying an extension 
profile with purge_old=True, would presumably be something like this 
example:
- The profile starts out with only a properties.xml, which adds a list 
property to the site root with three items in it.
- One of those was a mistake, so it is removed from properties.xml
- Now someone might apply the profile with purge_old=True, which should 
result in the list property ending up with only the two wanted 
properties.  (Better would of course be to write a proper upgrade step.)
In that case, I don't think the user can expect that the profile upgrade 
versions are purged.

In the case of a BASE profile, the UI already says something like: "this 
is dangerous, you probably do not want this."

So I would say: we purge the profile upgrade versions only if a base 
profile is imported, and should_purge is None or True.  I have updated 
the pull request with that.

Does that sound reasonable?

-- 
Maurits van Rees: http://maurits.vanrees.org/
Zest Software: http://zestsoftware.nl



More information about the Zope-CMF mailing list