| load("//java/private:common.bzl", "MavenInfo", "explode_coordinates", "read_coordinates") |
| load("//java/private:module.bzl", "JavaModuleInfo") |
| |
| DistInfo = provider( |
| fields = { |
| "target": "Label that this info was derived from", |
| "name": "The name by which this target is known, which may be derived from maven coordinates", |
| "binary_jars": "The binary jars associated with this target", |
| "source_jars": "The source jars associated with this target", |
| }, |
| ) |
| |
| DistZipInfo = provider( |
| fields = { |
| "dist_infos": "Depset of transitive DistInfos", |
| }, |
| ) |
| |
| _ATTR_ASPECTS = [ |
| "deps", |
| "exports", |
| "runtime_deps", |
| ] |
| |
| def _name(coordinates, default): |
| if not coordinates: |
| return default |
| exploded = explode_coordinates(coordinates) |
| return exploded[1] + "-" + exploded[2] |
| |
| def _dist_aspect_impl(target, ctx): |
| deps = getattr(ctx.rule.attr, "deps", []) |
| exports = getattr(ctx.rule.attr, "exports", []) |
| rt_deps = getattr(ctx.rule.attr, "runtime_deps", []) |
| |
| all_deps = deps + exports + rt_deps |
| transitive_infos = [d[DistZipInfo].dist_infos for d in all_deps] |
| |
| name = None |
| binary_jars = [] |
| source_jars = [] |
| |
| if MavenInfo in target and target[MavenInfo].coordinates: |
| name = _name(target[MavenInfo].coordinates, None) |
| binary_jars = target[MavenInfo].artifact_jars |
| source_jars = target[MavenInfo].source_jars |
| elif JavaModuleInfo in target and target[JavaModuleInfo].name: |
| coordinates = read_coordinates(ctx.rule.attr.tags) |
| name = _name(coordinates, target[JavaModuleInfo].name) |
| binary_jars = target[JavaInfo].runtime_output_jars |
| source_jars = target[JavaInfo].source_jars |
| elif JavaInfo in target: |
| coordinates = read_coordinates(ctx.rule.attr.tags) |
| if coordinates: |
| name = _name(coordinates, None) |
| binary_jars = target[JavaInfo].runtime_output_jars |
| source_jars = target[JavaInfo].source_jars |
| |
| if len(binary_jars) > 1: |
| fail("Unsure how to handle expanding binary jars for " + target) |
| if len(source_jars) > 1: |
| fail("Unsure how to handle expanding source jars for " + target) |
| |
| current = DistInfo( |
| target = str(target.label), |
| name = name, |
| binary_jars = depset(binary_jars), |
| source_jars = depset(source_jars), |
| ) |
| |
| return [ |
| DistZipInfo( |
| dist_infos = depset([current], transitive = transitive_infos), |
| ), |
| ] |
| |
| dist_aspect = aspect( |
| _dist_aspect_impl, |
| attr_aspects = _ATTR_ASPECTS, |
| provides = [ |
| DistZipInfo, |
| ], |
| required_aspect_providers = [ |
| [JavaInfo], |
| [JavaInfo, JavaModuleInfo], |
| [MavenInfo], |
| ], |
| ) |
| |
| def _is_third_party(prefixes, target): |
| for prefix in prefixes: |
| if target.startswith(prefix): |
| return True |
| return False |
| |
| def separate_first_and_third_party(third_party_prefixes, dist_zip_infos): |
| combined = depset(transitive = [i.dist_infos for i in dist_zip_infos]) |
| |
| first_party = [] |
| third_party = [] |
| |
| for dist_zip_info in combined.to_list(): |
| if not dist_zip_info.name: |
| continue |
| if _is_third_party(third_party_prefixes, dist_zip_info.target): |
| third_party.append(dist_zip_info) |
| else: |
| first_party.append(dist_zip_info) |
| |
| return (first_party, third_party) |