Skip to content

Commit 935db47

Browse files
authored
Generate @package_metadata info for jvm_import targets (#1410)
1 parent 1bcdaea commit 935db47

File tree

7 files changed

+126
-2
lines changed

7 files changed

+126
-2
lines changed

BUILD

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
2+
load("@package_metadata//licenses/rules:license.bzl", "license")
3+
load("@package_metadata//rules:package_metadata.bzl", "package_metadata")
24

35
exports_files([
46
"defs.bzl",
@@ -8,12 +10,31 @@ exports_files([
810

911
licenses(["notice"]) # Apache 2.0
1012

13+
package_metadata(
14+
name = "package_metadata",
15+
attributes = [
16+
":license",
17+
],
18+
purl = "pkg:bazel/{}@{}".format(
19+
module_name(),
20+
module_version(),
21+
) if module_version() else "pkg:bazel/{}".format(module_name()),
22+
visibility = ["//visibility:public"],
23+
)
24+
25+
license(
26+
name = "license",
27+
kind = "@package_metadata//licenses/spdx:Apache-2.0",
28+
text = "LICENSE",
29+
)
30+
1131
bzl_library(
1232
name = "implementation",
1333
srcs = [
1434
":defs.bzl",
1535
":specs.bzl",
1636
"@bazel_features//:bzl_files",
37+
"@package_metadata//:srcs",
1738
"@rules_license//:docs_deps",
1839
],
1940
visibility = [

MODULE.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ bazel_dep(
1616
name = "bazel_skylib",
1717
version = "1.7.1",
1818
)
19+
bazel_dep(
20+
name = "package_metadata",
21+
version = "0.0.3",
22+
)
1923
bazel_dep(
2024
name = "platforms",
2125
version = "0.0.10",

REPO.bazel

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"""File declaring metadata applying to all packages and targets in the Bazel module."""
2+
3+
repo(
4+
default_package_metadata = [
5+
"//:package_metadata",
6+
],
7+
)

private/dependency_tree_parser.bzl

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ load(
2929
"strip_packaging_and_classifier_and_version",
3030
"to_repository_name",
3131
)
32-
load("//private/lib:coordinates.bzl", "unpack_coordinates")
32+
load("//private/lib:coordinates.bzl", "unpack_coordinates", "to_purl")
33+
load("//private/lib:urls.bzl", "scheme_and_host")
3334

3435
def _genrule_copy_artifact_from_http_file(artifact, visibilities):
3536
http_file_repository = to_repository_name(artifact["coordinates"])
@@ -244,22 +245,44 @@ copy_file(
244245
target_import_string.append("\tmaven_coordinates = \"%s\"," % coordinates)
245246
if len(artifact["urls"]):
246247
target_import_string.append("\tmaven_url = \"%s\"," % maven_url)
248+
249+
package_metadata_name = "%s_package_metadata" % target_label
250+
target_import_string.append("\tapplicable_licenses = [\":{}\"],".format(package_metadata_name))
251+
to_return.append("""
252+
package_metadata(
253+
name = {package_metadata_name},
254+
purl = {purl},
255+
visibility = ["//visibility:public"],
256+
)
257+
""".format(
258+
package_metadata_name = repr(package_metadata_name),
259+
purl = repr(to_purl(coordinates, scheme_and_host(maven_url))),
260+
))
247261
else:
248262
unpacked = unpack_coordinates(coordinates)
249263
url = maven_url if len(artifact["urls"]) else None
250264

251265
package_info_name = "%s_package_info" % target_label
252-
target_import_string.append("\tapplicable_licenses = [\":%s\"]," % package_info_name)
266+
package_metadata_name = "%s_package_metadata" % target_label
267+
target_import_string.append("\tapplicable_licenses = [\n\t\t\":{}\",\n\t\t\":{}\",\n\t],".format(package_info_name, package_metadata_name))
253268
to_return.append("""
254269
package_info(
255270
name = {name},
256271
package_name = {coordinates},
257272
package_url = {url},
258273
package_version = {version},
259274
)
275+
276+
package_metadata(
277+
name = {package_metadata_name},
278+
purl = {purl},
279+
visibility = ["//visibility:public"],
280+
)
260281
""".format(
261282
coordinates = repr(coordinates),
262283
name = repr(package_info_name),
284+
package_metadata_name = repr(package_metadata_name),
285+
purl = repr(to_purl(coordinates, scheme_and_host(url))),
263286
url = repr(url),
264287
version = repr(unpacked.version),
265288
))

private/rules/coursier.bzl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ _BUILD = """
3838
3939
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
4040
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
41+
load("@package_metadata//rules:package_metadata.bzl", "package_metadata")
4142
load("@rules_license//rules:package_info.bzl", "package_info")
4243
load("@rules_java//java:defs.bzl", "java_binary", "java_library", "java_plugin")
4344
load("@rules_jvm_external//private/rules:pin_dependencies.bzl", "pin_dependencies")

repositories.bzl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ def rules_jvm_external_deps(
9393
patch_args = ["-p1"],
9494
)
9595

96+
maybe(
97+
http_archive,
98+
name = "package_metadata",
99+
urls = [
100+
"https://mirror.bazel.build/github.com/bazel-contrib/supply-chain/releases/download/v0.0.3/supply-chain-v0.0.3.tar.gz",
101+
"https://github.com/bazel-contrib/supply-chain/releases/download/v0.0.3/supply-chain-v0.0.3.tar.gz",
102+
],
103+
sha256 = "0e89367f1cb6d93a5a1afea4b55b11ea6b28f63f653b47154153677ca7d4afea",
104+
strip_prefix = "supply-chain-0.0.3/metadata",
105+
)
106+
96107
maybe(
97108
http_archive,
98109
name = "rules_license",

tests/unit/jvm_import/jvm_import_test.bzl

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ This module contains a test suite for testing jvm_import
1717
"""
1818

1919
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
20+
load("@package_metadata//providers:package_metadata_info.bzl", "PackageMetadataInfo")
2021
load("@rules_license//rules:gather_metadata.bzl", "gather_metadata_info")
2122
load("@rules_license//rules:providers.bzl", "PackageInfo")
2223
load("@rules_license//rules_gathering:gathering_providers.bzl", "TransitiveMetadataInfo")
@@ -28,6 +29,13 @@ TagsInfo = provider(
2829
},
2930
)
3031

32+
PackageMetadataInfoCollectionInfo = provider(
33+
doc = "Provider to propagate jvm_import's applicable_licenses for testing purposes",
34+
fields = {
35+
"info": "A PackageMetadataInfo provider from jvm_import's applicable_licenses for testing purposes",
36+
},
37+
)
38+
3139
def _tags_propagator_impl(target, ctx):
3240
tags = getattr(ctx.rule.attr, "tags")
3341
return TagsInfo(tags = tags)
@@ -38,6 +46,30 @@ tags_propagator = aspect(
3846
implementation = _tags_propagator_impl,
3947
)
4048

49+
def _package_metadata_info_propagator_impl(target, ctx):
50+
direct = getattr(ctx.rule.attr, "package_metadata", None)
51+
if not direct:
52+
direct = getattr(ctx.rule.attr, "applicable_licenses")
53+
54+
infos = [t[PackageMetadataInfo] for t in direct if PackageMetadataInfo in t]
55+
for t in direct:
56+
if PackageMetadataInfo not in t:
57+
continue
58+
59+
return [
60+
PackageMetadataInfoCollectionInfo(
61+
info = t[PackageMetadataInfo],
62+
),
63+
]
64+
65+
return []
66+
67+
package_metadata_info_propagator = aspect(
68+
doc = "Aspect that propagates applicable_licenses to help with testing jvm_import",
69+
attr_aspects = [],
70+
implementation = _package_metadata_info_propagator_impl,
71+
)
72+
4173
def _does_jvm_import_have_tags_impl(ctx):
4274
env = analysistest.begin(ctx)
4375

@@ -62,6 +94,26 @@ does_jvm_import_have_tags_test = analysistest.make(
6294
},
6395
)
6496

97+
def _does_jvm_import_have_applicable_licenses_impl(ctx):
98+
env = analysistest.begin(ctx)
99+
100+
asserts.true(env, PackageMetadataInfoCollectionInfo in ctx.attr.src)
101+
info = ctx.attr.src[PackageMetadataInfoCollectionInfo]
102+
asserts.true(env, info.info)
103+
104+
return analysistest.end(env)
105+
106+
does_jvm_import_have_applicable_licenses_test = analysistest.make(
107+
_does_jvm_import_have_applicable_licenses_impl,
108+
attrs = {
109+
"src": attr.label(
110+
doc = "Target to traverse for applicable_licenses",
111+
aspects = [package_metadata_info_propagator],
112+
mandatory = True,
113+
),
114+
},
115+
)
116+
65117
def _does_jvm_import_export_a_package_provider_impl(ctx):
66118
env = analysistest.begin(ctx)
67119

@@ -116,6 +168,11 @@ def jvm_import_test_suite(name):
116168
target_under_test = "@jvm_import_test//:com_google_code_findbugs_jsr305_3_0_2",
117169
src = "@jvm_import_test//:com_google_code_findbugs_jsr305_3_0_2",
118170
)
171+
does_jvm_import_have_applicable_licenses_test(
172+
name = "does_jvm_import_have_applicable_licenses_test",
173+
target_under_test = "@jvm_import_test//:com_google_code_findbugs_jsr305_3_0_2",
174+
src = "@jvm_import_test//:com_google_code_findbugs_jsr305_3_0_2",
175+
)
119176
does_jvm_import_export_a_package_provider_test(
120177
name = "does_jvm_import_export_a_package_provider",
121178
target_under_test = "@jvm_import_test//:com_google_code_findbugs_jsr305",

0 commit comments

Comments
 (0)