Ejemplo n.º 1
0
 def _address_specs_to_targets(self, build_graph: LegacyBuildGraph, address_specs: AddressSpecs):
     """Populate the BuildGraph and target list from a set of input TargetRoots."""
     with self._run_tracker.new_workunit(name="parse", labels=[WorkUnitLabel.SETUP]):
         return [
             build_graph.get_target(address)
             for address in build_graph.inject_roots_closure(address_specs, self._fail_fast)
         ]
Ejemplo n.º 2
0
    def create_build_graph(self,
                           target_roots,
                           build_root=None,
                           include_trace_on_error=True):
        """Construct and return a `BuildGraph` given a set of input specs.

    :param TargetRoots target_roots: The targets root of the request.
    :param string build_root: The build root.
    :returns: A tuple of (BuildGraph, AddressMapper).
    """
        logger.debug('target_roots are: %r', target_roots)
        graph = LegacyBuildGraph.create(
            self.scheduler,
            self.engine,
            self.symbol_table_cls,
            include_trace_on_error=include_trace_on_error)
        logger.debug('build_graph is: %s', graph)
        with self.scheduler.locked():
            # Ensure the entire generator is unrolled.
            for _ in graph.inject_specs_closure(target_roots.as_specs()):
                pass

        logger.debug('engine cache stats: %s', self.engine.cache_stats())
        address_mapper = LegacyAddressMapper(self.scheduler, self.engine,
                                             build_root or get_buildroot())
        logger.debug('address_mapper is: %s', address_mapper)
        return graph, address_mapper
Ejemplo n.º 3
0
    def iter_changed_target_addresses(self, changed_request):
        """Given a `ChangedRequest`, compute and yield all affected target addresses."""
        changed_files = self.changed_files(changed_request.changes_since,
                                           changed_request.diffspec)
        logger.debug('changed files: %s', changed_files)
        if not changed_files:
            return

        changed_addresses = set(
            address
            for address in self._mapper.iter_target_addresses_for_sources(
                changed_files))
        for address in changed_addresses:
            yield address

        if changed_request.include_dependees not in ('direct', 'transitive'):
            return

        # For dependee finding, we need to parse all build files.
        graph = LegacyBuildGraph.create(self._scheduler, self._engine,
                                        self._symbol_table_cls)
        for _ in graph.inject_specs_closure([DescendantAddresses('')]):
            pass

        if changed_request.include_dependees == 'direct':
            emitted = set()
            for address in changed_addresses:
                for dependee in graph.dependents_of(address):
                    if dependee not in emitted:
                        emitted.add(dependee)
                        yield dependee
        elif changed_request.include_dependees == 'transitive':
            for target in graph.transitive_dependees_of_addresses(
                    changed_addresses):
                yield target.address
Ejemplo n.º 4
0
  def iter_changed_target_addresses(self, changed_request):
    """Given a `ChangedRequest`, compute and yield all affected target addresses."""
    changed_files = self.changed_files(changed_request.changes_since, changed_request.diffspec)
    logger.debug('changed files: %s', changed_files)
    if not changed_files:
      return

    changed_addresses = set(address
                            for address
                            in self._mapper.iter_target_addresses_for_sources(changed_files))
    for address in changed_addresses:
      yield address

    if changed_request.include_dependees not in ('direct', 'transitive'):
      return

    # For dependee finding, we need to parse all build files.
    graph = LegacyBuildGraph.create(self._scheduler, self._symbol_table_cls)
    for _ in graph.inject_specs_closure([DescendantAddresses('')]):
      pass

    if changed_request.include_dependees == 'direct':
      emitted = set()
      for address in changed_addresses:
        for dependee in graph.dependents_of(address):
          if dependee not in emitted:
            emitted.add(dependee)
            yield dependee
    elif changed_request.include_dependees == 'transitive':
      for target in graph.transitive_dependees_of_addresses(changed_addresses):
        yield target.address
Ejemplo n.º 5
0
    def test_create_bad_targets(self):
        with self.assertRaises(TypeError):
            BuildFileAliases(targets={'fred': object()})

        target = Target('fred', Address.parse('a:b'),
                        LegacyBuildGraph(None, None))
        with self.assertRaises(TypeError):
            BuildFileAliases(targets={'fred': target})
Ejemplo n.º 6
0
  def create_build_graph(self, target_roots, build_root=None):
    """Construct and return a `BuildGraph` given a set of input specs.

    :param TargetRoots target_roots: The targets root of the request.
    :param string build_root: The build root.
    :returns: A tuple of (BuildGraph, AddressMapper).
    """
    logger.debug('target_roots are: %r', target_roots)
    graph = LegacyBuildGraph(self.scheduler, self.engine, self.symbol_table_cls)
    logger.debug('build_graph is: %s', graph)
    with self.scheduler.locked():
      # Ensure the entire generator is unrolled.
      for _ in graph.inject_specs_closure(target_roots.as_specs()):
        pass

    logger.debug('engine cache stats: %s', self.engine.cache_stats())
    address_mapper = LegacyAddressMapper(self.scheduler, self.engine, build_root or get_buildroot())
    logger.debug('address_mapper is: %s', address_mapper)
    return graph, address_mapper
Ejemplo n.º 7
0
    def test_addresses_in_spec_path_wraps_error_in_buildfile_scan_error(self):
        graph_mock = mock.Mock()
        graph_mock.inject_specs_closure = mock.Mock(
            side_effect=LegacyBuildGraph.InvalidCommandLineSpecError(
                'some msg'))

        mapper = LegacyAddressMapper(graph_mock, '')
        with self.assertRaises(AddressMapper.BuildFileScanError) as cm:
            mapper.addresses_in_spec_path('some/path')
        self.assertEqual('some msg', str(cm.exception))
Ejemplo n.º 8
0
    def create_build_graph(
        self, specs: Specs, build_root: Optional[str] = None,
    ) -> Tuple[LegacyBuildGraph, LegacyAddressMapper]:
        """Construct and return a `BuildGraph` given a set of input specs."""
        logger.debug("specs are: %r", specs)
        graph = LegacyBuildGraph.create(self.scheduler_session, self.build_file_aliases)
        logger.debug("build_graph is: %s", graph)
        # Ensure the entire generator is unrolled.
        for _ in graph.inject_roots_closure(specs.address_specs):
            pass

        address_mapper = LegacyAddressMapper(self.scheduler_session, build_root or get_buildroot())
        logger.debug("address_mapper is: %s", address_mapper)
        return graph, address_mapper
Ejemplo n.º 9
0
  def create_build_graph(self, target_roots, build_root=None):
    """Construct and return a `BuildGraph` given a set of input specs.

    :param TargetRoots target_roots: The targets root of the request.
    :param string build_root: The build root.
    :returns: A tuple of (BuildGraph, AddressMapper).
    """
    logger.debug('target_roots are: %r', target_roots)
    graph = LegacyBuildGraph.create(self.scheduler_session, self.build_file_aliases)
    logger.debug('build_graph is: %s', graph)
    # Ensure the entire generator is unrolled.
    for _ in graph.inject_roots_closure(target_roots):
      pass

    address_mapper = LegacyAddressMapper(self.scheduler_session, build_root or get_buildroot())
    logger.debug('address_mapper is: %s', address_mapper)
    return graph, address_mapper
Ejemplo n.º 10
0
  def create_build_graph(self, target_roots, build_root=None):
    """Construct and return a `BuildGraph` given a set of input specs.

    :param TargetRoots target_roots: The targets root of the request.
    :param string build_root: The build root.
    :returns: A tuple of (BuildGraph, AddressMapper).
    """
    logger.debug('target_roots are: %r', target_roots)
    graph = LegacyBuildGraph.create(self.scheduler_session, self.build_file_aliases)
    logger.debug('build_graph is: %s', graph)
    # Ensure the entire generator is unrolled.
    for _ in graph.inject_roots_closure(target_roots):
      pass

    address_mapper = LegacyAddressMapper(self.scheduler_session, build_root or get_buildroot())
    logger.debug('address_mapper is: %s', address_mapper)
    return graph, address_mapper