def run(self): queue = self.queue if not queue: return tasks = dict((task.name, task) for task in queue) while queue: task = queue.pop(0) for requirement in task.requires: if requirement not in tasks: required_task = Tasks.get(requirement)(self) tasks[requirement] = required_task queue.append(required_task) task.dependencies.add(tasks[requirement]) graph = dict((task, task.dependencies) for task in tasks.itervalues()) self.queue = topological_sort(graph) while self.queue: task = self.queue.pop(0) try: self.execute(task) except TaskFailed: return False else: self.completed.append(task)
def execute(self, task, environment=None, **params): if environment or params: environment = self.environment.overlay(environment, **params) if isinstance(task, basestring): task = Tasks.get(task)(self) if task.independent: self._reset_path() self.context.append(task.name) try: if task.execute(environment) is False: raise TaskFailed() finally: self.context.pop()
def _find_task(self, name): try: task = Tasks.get(name) except MultipleTasksError, exception: self.error('multiple tasks!!!') return False