code: def iter_target_siblings_and_ancestors(self, target):
      
      def iter_targets_in_spec_path(spec_path):
        try:
          siblings = SiblingAddresses(spec_path)
          for address in self._build_graph.inject_specs_closure([siblings]):
            yield self._build_graph.get_target(address)
        except AddressLookupError:
          # A spec path may not have any addresses registered under it and that's ok.
          # For example:
          #  a:a
          #  a/b/c:c
          #
          # Here a/b contains no addresses.
          pass
  
      def iter_siblings_and_ancestors(spec_path):
        for sibling in iter_targets_in_spec_path(spec_path):
          yield sibling
        parent_spec_path = os.path.dirname(spec_path)
        if parent_spec_path != spec_path:
          for parent in iter_siblings_and_ancestors(parent_spec_path):
            yield parent
  
      for target in iter_siblings_and_ancestors(target.address.spec_path):
        yield target
docs: Produces an iterator over a target's siblings and ancestor lineage.
  
      :returns: A target iterator yielding the target and its siblings and then it ancestors from
                nearest to furthest removed.