def _visit_goal(self, goal, context, goal_info_by_goal, target_roots_replacement): if goal in goal_info_by_goal: return tasktypes_by_name = OrderedDict() goal_dependencies = set() visited_task_types = set() for task_name in reversed(goal.ordered_task_names()): task_type = goal.task_type_by_name(task_name) tasktypes_by_name[task_name] = task_type visited_task_types.add(task_type) alternate_target_roots = task_type._alternate_target_roots( context.options, context.address_mapper, context.build_graph) target_roots_replacement.propose_alternates( task_type, alternate_target_roots) round_manager = RoundManager(context) task_type._prepare(context.options, round_manager) try: dependencies = round_manager.get_dependencies() for producer_info in dependencies: producer_goal = producer_info.goal if producer_goal == goal: if producer_info.task_type in visited_task_types: ordering = '\n\t'.join( "[{0}] '{1}' {2}".format( i, tn, goal.task_type_by_name(tn).__name__) for i, tn in enumerate( goal.ordered_task_names())) raise self.TaskOrderError( "TaskRegistrar '{name}' with action {consumer_task} depends on {data} from task " "{producer_task} which is ordered after it in the '{goal}' goal:\n\t{ordering}" .format(name=task_name, consumer_task=task_type.__name__, data=producer_info.product_type, producer_task=producer_info.task_type. __name__, goal=goal.name, ordering=ordering)) else: # We don't express dependencies on downstream tasks in this same goal. pass else: goal_dependencies.add(producer_goal) except round_manager.MissingProductError as e: raise self.MissingProductError( "Could not satisfy data dependencies for goal '{name}' with action {action}: {error}" .format(name=task_name, action=task_type.__name__, error=e)) goal_info = self.GoalInfo(goal, tasktypes_by_name, goal_dependencies) goal_info_by_goal[goal] = goal_info for goal_dependency in goal_dependencies: self._visit_goal(goal_dependency, context, goal_info_by_goal, target_roots_replacement)
def _visit_goal(self, goal, context, goal_info_by_goal): if goal in goal_info_by_goal: return tasktypes_by_name = OrderedDict() goal_dependencies = set() visited_task_types = set() for task_name in reversed(goal.ordered_task_names()): task_type = goal.task_type_by_name(task_name) tasktypes_by_name[task_name] = task_type visited_task_types.add(task_type) round_manager = RoundManager(context) task_type.invoke_prepare(context.options, round_manager) try: dependencies = round_manager.get_dependencies() for producer_info in dependencies: producer_goal = producer_info.goal if producer_goal == goal: if producer_info.task_type == task_type: # We allow a task to produce products it itself needs. We trust the Task writer # to arrange for proper sequencing. pass elif producer_info.task_type in visited_task_types: ordering = "\n\t".join( "[{0}] '{1}' {2}".format( i, tn, goal.task_type_by_name(tn).__name__) for i, tn in enumerate( goal.ordered_task_names())) raise self.TaskOrderError( "TaskRegistrar '{name}' with action {consumer_task} depends on {data} from task " "{producer_task} which is ordered after it in the '{goal}' goal:\n\t{ordering}" .format( name=task_name, consumer_task=task_type.__name__, data=producer_info.product_type, producer_task=producer_info.task_type. __name__, goal=goal.name, ordering=ordering, )) else: # We don't express dependencies on downstream tasks in this same goal. pass else: goal_dependencies.add(producer_goal) except round_manager.MissingProductError as e: raise self.MissingProductError( "Could not satisfy data dependencies for goal '{name}' with action {action}: {error}" .format(name=task_name, action=task_type.__name__, error=e)) goal_info = self.GoalInfo(goal, tasktypes_by_name, goal_dependencies) goal_info_by_goal[goal] = goal_info for goal_dependency in goal_dependencies: self._visit_goal(goal_dependency, context, goal_info_by_goal)
def _visit_goal(self, goal, context, goal_info_by_goal, target_roots_replacement): if goal in goal_info_by_goal: return tasktypes_by_name = OrderedDict() goal_dependencies = set() visited_task_types = set() for task_name in reversed(goal.ordered_task_names()): task_type = goal.task_type_by_name(task_name) tasktypes_by_name[task_name] = task_type visited_task_types.add(task_type) alternate_target_roots = task_type.get_alternate_target_roots(context.options, context.address_mapper, context.build_graph) target_roots_replacement.propose_alternates(task_type, alternate_target_roots) round_manager = RoundManager(context) task_type.invoke_prepare(context.options, round_manager) try: dependencies = round_manager.get_dependencies() for producer_info in dependencies: producer_goal = producer_info.goal if producer_goal == goal: if producer_info.task_type == task_type: # We allow a task to produce products it itself needs. We trust the Task writer # to arrange for proper sequencing. pass elif producer_info.task_type in visited_task_types: ordering = '\n\t'.join("[{0}] '{1}' {2}".format(i, tn, goal.task_type_by_name(tn).__name__) for i, tn in enumerate(goal.ordered_task_names())) raise self.TaskOrderError( "TaskRegistrar '{name}' with action {consumer_task} depends on {data} from task " "{producer_task} which is ordered after it in the '{goal}' goal:\n\t{ordering}" .format(name=task_name, consumer_task=task_type.__name__, data=producer_info.product_type, producer_task=producer_info.task_type.__name__, goal=goal.name, ordering=ordering)) else: # We don't express dependencies on downstream tasks in this same goal. pass else: goal_dependencies.add(producer_goal) except round_manager.MissingProductError as e: raise self.MissingProductError( "Could not satisfy data dependencies for goal '{name}' with action {action}: {error}" .format(name=task_name, action=task_type.__name__, error=e)) goal_info = self.GoalInfo(goal, tasktypes_by_name, goal_dependencies) goal_info_by_goal[goal] = goal_info for goal_dependency in goal_dependencies: self._visit_goal(goal_dependency, context, goal_info_by_goal, target_roots_replacement)
def _visit_phase(self, phase, context, phase_info_by_phase): if phase in phase_info_by_phase: return tasks_by_name = OrderedDict() phase_dependencies = set() visited_task_types = set() phase_goals = phase.goals() for goal in reversed(phase_goals): task_type = goal.task_type visited_task_types.add(task_type) task_workdir = os.path.join(context.config.getdefault('pants_workdir'), phase.name, goal.name) task = task_type(context, task_workdir) tasks_by_name[goal.name] = task round_manager = RoundManager(context) task.prepare(round_manager) try: dependencies = round_manager.get_dependencies() for producer_info in dependencies: producer_phase = producer_info.phase if producer_phase == phase: if producer_info.task_type in visited_task_types: ordering = '\n\t'.join("[{0}] '{1}' {2}".format(i, goal.name, goal.task_type.__name__) for i, goal in enumerate(phase_goals)) raise self.TaskOrderError( "Goal '{name}' with action {consumer_task} depends on {data} from task " "{producer_task} which is ordered after it in the '{phase}' phase:\n\t{ordering}" .format(name=goal.name, consumer_task=task_type.__name__, data=producer_info.product_type, producer_task=producer_info.task_type.__name__, phase=phase.name, ordering=ordering)) else: # We don't express dependencies on downstream tasks in this same phase. pass else: phase_dependencies.add(producer_phase) except round_manager.MissingProductError as e: raise self.MissingProductError( "Could not satisfy data dependencies for goal '{name}' with action {action}: {error}" .format(name=goal.name, action=task_type.__name__, error=e)) phase_info = self.PhaseInfo(phase, tasks_by_name, phase_dependencies) phase_info_by_phase[phase] = phase_info for phase_dependency in phase_dependencies: self._visit_phase(phase_dependency, context, phase_info_by_phase)
def _visit_goal(self, goal, context, goal_info_by_goal): if goal in goal_info_by_goal: return tasks_by_name = OrderedDict() goal_dependencies = set() visited_task_types = set() for task_name in reversed(goal.ordered_task_names()): task_type = goal.task_type_by_name(task_name) visited_task_types.add(task_type) task_workdir = os.path.join(context.new_options.for_global_scope().pants_workdir, goal.name, task_name) task = task_type(context, task_workdir) tasks_by_name[task_name] = task round_manager = RoundManager(context) task.prepare(round_manager) try: dependencies = round_manager.get_dependencies() for producer_info in dependencies: producer_goal = producer_info.goal if producer_goal == goal: if producer_info.task_type in visited_task_types: ordering = '\n\t'.join("[{0}] '{1}' {2}".format(i, tn, goal.task_type_by_name(tn).__name__) for i, tn in enumerate(goal.ordered_task_names())) raise self.TaskOrderError( "TaskRegistrar '{name}' with action {consumer_task} depends on {data} from task " "{producer_task} which is ordered after it in the '{goal}' goal:\n\t{ordering}" .format(name=task_name, consumer_task=task_type.__name__, data=producer_info.product_type, producer_task=producer_info.task_type.__name__, goal=goal.name, ordering=ordering)) else: # We don't express dependencies on downstream tasks in this same goal. pass else: goal_dependencies.add(producer_goal) except round_manager.MissingProductError as e: raise self.MissingProductError( "Could not satisfy data dependencies for goal '{name}' with action {action}: {error}" .format(name=task_name, action=task_type.__name__, error=e)) goal_info = self.GoalInfo(goal, tasks_by_name, goal_dependencies) goal_info_by_goal[goal] = goal_info for goal_dependency in goal_dependencies: self._visit_goal(goal_dependency, context, goal_info_by_goal)