in src/python/pants/backend/jvm/tasks/jar_publish.py [0:0]
def check_targets(self, targets):
self.check_for_duplicate_artifacts(targets)
invalid = defaultdict(lambda: defaultdict(set))
derived_by_target = defaultdict(set)
def collect_invalid(publish_target, walked_target):
for derived_target in walked_target.derived_from_chain:
derived_by_target[derived_target].add(walked_target)
if not walked_target.has_sources() or not walked_target.sources_relative_to_buildroot():
invalid[publish_target][walked_target].add('No sources.')
if not self._is_exported(walked_target):
invalid[publish_target][walked_target].add('Does not provide a binary artifact.')
for target in targets:
target.walk(functools.partial(collect_invalid, target),
predicate=lambda t: isinstance(t, Jarable))
# When walking the graph of a publishable target, we may encounter families of sibling targets
# that form a derivation chain. As long as one of these siblings is publishable, we can
# proceed and publish a valid graph.
for publish_target, invalid_targets in list(invalid.items()):
for invalid_target, reasons in list(invalid_targets.items()):
derived_from_set = derived_by_target[invalid_target]
if derived_from_set - set(invalid_targets.keys()):
invalid_targets.pop(invalid_target)
if not invalid_targets:
invalid.pop(publish_target)
if invalid:
msg = list()
def first_address(pair):
first, _ = pair
return str(first.address)
for publish_target, invalid_targets in sorted(invalid.items(), key=first_address):
msg.append('\n Cannot publish {} due to:'.format(publish_target.address))
for invalid_target, reasons in sorted(invalid_targets.items(), key=first_address):
for reason in sorted(reasons):
msg.append('\n {} - {}'.format(invalid_target.address, reason))
raise TaskError('The following errors must be resolved to publish.{}'.format(''.join(msg)))