blob: 97c8b9bddbc979328351dd088d808cc8ba121a1b [file] [log] [blame] [edit]
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)