From 0d6cc0b74d6cd5be89fe89fc3b4935a9a4a5e81a Mon Sep 17 00:00:00 2001 From: Chuck Grindel Date: Wed, 2 Oct 2024 14:00:30 -0600 Subject: [PATCH 1/2] fix: check for target_under_license before attempting to access --- rules/gather_licenses_info.bzl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/rules/gather_licenses_info.bzl b/rules/gather_licenses_info.bzl index 518d5ff..64f9a43 100644 --- a/rules/gather_licenses_info.bzl +++ b/rules/gather_licenses_info.bzl @@ -30,9 +30,9 @@ def _strip_null_repo(label): The is to make str(label) compatible between bazel 5.x and 6.x """ s = str(label) - if s.startswith('@//'): + if s.startswith("@//"): return s[1:] - elif s.startswith('@@//'): + elif s.startswith("@@//"): return s[2:] return s @@ -150,7 +150,7 @@ def write_licenses_info(ctx, deps, json_out): licenses_files = [] for dep in deps: if TransitiveLicensesInfo in dep: - transitive_licenses_info = dep[TransitiveLicensesInfo] + transitive_licenses_info = dep[TransitiveLicensesInfo] lic_info, _ = licenses_info_to_json(transitive_licenses_info) licenses_json.extend(lic_info) for info in transitive_licenses_info.licenses.to_list(): @@ -253,6 +253,7 @@ def licenses_info_to_json(licenses_info): label = _strip_null_repo(license.label), used_by = ",\n ".join(sorted(['"%s"' % x for x in used_by[str(license.label)]])), )) + # Additionally return all File references so that other rules invoking # this method can load license text file contents from external repos # using runfiles @@ -266,8 +267,12 @@ def licenses_info_to_json(licenses_info): licenses = ",\n ".join(sorted(['"%s"' % _strip_null_repo(x) for x in dep_licenses])), )) + top_level_target = "" + if hasattr(licenses_info, "target_under_license"): + top_level_target = licenses_info.target_under_license + return [main_template.format( - top_level_target = _strip_null_repo(licenses_info.target_under_license), + top_level_target = _strip_null_repo(top_level_target), dependencies = ",".join(all_deps), licenses = ",".join(all_licenses), )], all_license_text_files From ed5bb2515c7e57ef48e361cc4977b54a25002d71 Mon Sep 17 00:00:00 2001 From: Chuck Grindel Date: Wed, 2 Oct 2024 14:40:59 -0600 Subject: [PATCH 2/2] Change fix to ensure that we return a valid license info. --- rules/gather_licenses_info.bzl | 13 ++++--------- rules/licenses_core.bzl | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/rules/gather_licenses_info.bzl b/rules/gather_licenses_info.bzl index 64f9a43..518d5ff 100644 --- a/rules/gather_licenses_info.bzl +++ b/rules/gather_licenses_info.bzl @@ -30,9 +30,9 @@ def _strip_null_repo(label): The is to make str(label) compatible between bazel 5.x and 6.x """ s = str(label) - if s.startswith("@//"): + if s.startswith('@//'): return s[1:] - elif s.startswith("@@//"): + elif s.startswith('@@//'): return s[2:] return s @@ -150,7 +150,7 @@ def write_licenses_info(ctx, deps, json_out): licenses_files = [] for dep in deps: if TransitiveLicensesInfo in dep: - transitive_licenses_info = dep[TransitiveLicensesInfo] + transitive_licenses_info = dep[TransitiveLicensesInfo] lic_info, _ = licenses_info_to_json(transitive_licenses_info) licenses_json.extend(lic_info) for info in transitive_licenses_info.licenses.to_list(): @@ -253,7 +253,6 @@ def licenses_info_to_json(licenses_info): label = _strip_null_repo(license.label), used_by = ",\n ".join(sorted(['"%s"' % x for x in used_by[str(license.label)]])), )) - # Additionally return all File references so that other rules invoking # this method can load license text file contents from external repos # using runfiles @@ -267,12 +266,8 @@ def licenses_info_to_json(licenses_info): licenses = ",\n ".join(sorted(['"%s"' % _strip_null_repo(x) for x in dep_licenses])), )) - top_level_target = "" - if hasattr(licenses_info, "target_under_license"): - top_level_target = licenses_info.target_under_license - return [main_template.format( - top_level_target = _strip_null_repo(top_level_target), + top_level_target = _strip_null_repo(licenses_info.target_under_license), dependencies = ",".join(all_deps), licenses = ",".join(all_licenses), )], all_license_text_files diff --git a/rules/licenses_core.bzl b/rules/licenses_core.bzl index fff3b82..921cb06 100644 --- a/rules/licenses_core.bzl +++ b/rules/licenses_core.bzl @@ -151,7 +151,12 @@ def gather_metadata_info_common(target, ctx, provider_factory, metadata_provider # fully resolved. If exec is in the bin_dir path, then the current # configuration is probably cfg = exec. if "-exec-" in ctx.bin_dir.path: - return [provider_factory(deps = depset(), licenses = depset(), traces = [])] + return [provider_factory( + target_under_license = target.label, + deps = depset(), + licenses = depset(), + traces = [], + )] # Now gather transitive collection of providers from the targets # this target depends upon. @@ -164,7 +169,12 @@ def gather_metadata_info_common(target, ctx, provider_factory, metadata_provider _get_transitive_metadata(ctx, trans_licenses, trans_other_metadata, trans_package_info, trans_deps, traces, provider_factory, filter_func) if not licenses and not trans_licenses: - return [provider_factory(deps = depset(), licenses = depset(), traces = [])] + return [provider_factory( + target_under_license = target.label, + deps = depset(), + licenses = depset(), + traces = [], + )] # If this is the target, start the sequence of traces. if ctx.attr._trace[TraceInfo].trace and ctx.attr._trace[TraceInfo].trace in str(ctx.label):