Skip to content

Commit

Permalink
Factor the dependency calculation out into a new getProfileDependency…
Browse files Browse the repository at this point in the history
…Chain method.
  • Loading branch information
wichert committed Jan 13, 2008
1 parent 0964740 commit 6448157
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 30 deletions.
8 changes: 8 additions & 0 deletions Products/GenericSetup/interfaces.py
Expand Up @@ -496,6 +496,14 @@ def getToolsetRegistry():
""" Return the IToolsetRegistry for the tool.
"""

def getProfileDependencyChain( profile_id ):

"""Return a list of dependencies for a profile.
The list is ordered by install order, with the requested profile as
last item.
"""

def runImportStepFromProfile(profile_id, step_id,
run_dependencies=True, purge_old=None):

Expand Down
81 changes: 51 additions & 30 deletions Products/GenericSetup/tool.py
Expand Up @@ -902,6 +902,11 @@ def getProfileInfo(self, profile_id):

security.declareProtected(ManagePortal, 'getDependenciesForProfile')
def getDependenciesForProfile(self, profile_id):
if profile_id.startswith("snapshot-"):
return ()

if not self.profileExists( profile_id ):
raise KeyError, profile_id
try:
return self.getProfileInfo( profile_id ).get('dependencies', ())
except KeyError:
Expand Down Expand Up @@ -1114,6 +1119,25 @@ def _doRunExportSteps(self, steps):
, 'filename' : context.getArchiveFilename()
}


security.declareProtected(ManagePortal, 'getProfileInstallChain')
def getProfileDependencyChain(self, profile_id, seen=None):
if seen is None:
seen = set()
elif profile_id in seen:
return [] # cycle break
seen.add( profile_id )
chain = []

dependencies = self.getDependenciesForProfile( profile_id )
for dependency in dependencies:
chain.extend(self.getProfileDependencyChain( dependency, seen ))

chain.append(profile_id)

return chain


security.declarePrivate('_runImportStepsFromContext')
def _runImportStepsFromContext(self,
steps=None,
Expand All @@ -1123,45 +1147,42 @@ def _runImportStepsFromContext(self,
ignore_dependencies=False,
seen=None):

results = []

if not ignore_dependencies:
try:
chain = self.getProfileDependencyChain( profile_id )
except KeyError, e:
logger = logging.getLogger('GenericSetup')
logger.error('Unknown step in dependency chain: %s' % str(e))
raise
else:
chain = [ profile_id ]
if seen is None:
seen=set()
seen.add( profile_id )

dependencies = self.getDependenciesForProfile( profile_id )
for dependency in dependencies:
if dependency not in seen:
if not self.profileExists( dependency ):
warn("Profile %s depends on unknown profile %s" % (profile_id, dependency))
continue
res = self._runImportStepsFromContext(steps=steps,
purge_old=purge_old,
profile_id=dependency,
ignore_dependencies=ignore_dependencies,
seen=seen)
results.append( res )

context = self._getImportContext(profile_id, purge_old, archive)
self.applyContext(context)

results = []

if steps is None:
steps = self.getSortedImportSteps()
messages = {}
for profile_id in chain:
context = self._getImportContext(profile_id, purge_old, archive)
self.applyContext(context)

event.notify(BeforeProfileImportEvent(self, profile_id, steps, True))
for step in steps:
message = self._doRunImportStep(step, context)
message_list = filter(None, [message])
message_list.extend( ['%s: %s' % x[1:]
for x in context.listNotes()] )
messages[step] = '\n'.join(message_list)
context.clearNotes()
if steps is None:
steps = self.getSortedImportSteps()
messages = {}

event.notify(BeforeProfileImportEvent(self, profile_id, steps, True))
for step in steps:
message = self._doRunImportStep(step, context)
message_list = filter(None, [message])
message_list.extend( ['%s: %s' % x[1:]
for x in context.listNotes()] )
messages[step] = '\n'.join(message_list)
context.clearNotes()

event.notify(ProfileImportedEvent(self, profile_id, steps, True))
event.notify(ProfileImportedEvent(self, profile_id, steps, True))

results.append({'steps' : steps, 'messages' : messages })
results.append({'steps' : steps, 'messages' : messages })

data = { 'steps' : [], 'messages' : {}}
for result in results:
Expand Down

0 comments on commit 6448157

Please sign in to comment.