From 4ff83401dc0b25789468d6b4a3af2fa49b9db115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?X=C3=B9d=C5=8Dng=20Y=C3=A1ng?= Date: Wed, 4 Sep 2024 14:28:10 -0400 Subject: [PATCH] [7.4.0] Use worker threads for module extension eval (#23504) Cherry-picks of: * https://github.com/bazelbuild/bazel/commit/c5c5db44872c4709ff6c1768fdf95b87645de94b * https://github.com/bazelbuild/bazel/commit/d24f94734266c4331ba8324a470d60ae68c26edc * https://github.com/bazelbuild/bazel/commit/23e5ec157d582585bb9635b5c374ec21cc50b4ea * https://github.com/bazelbuild/bazel/commit/bf27b7dc584d20fab0100103b1419ae9ba66564f --- MODULE.bazel | 4 +- MODULE.bazel.lock | 56 +- maven_install.json | 56 +- .../com/google/devtools/build/lib/bazel/BUILD | 1 + .../devtools/build/lib/bazel/bzlmod/BUILD | 54 +- .../bazel/bzlmod/InnateRunnableExtension.java | 295 ++++++++ .../bzlmod/RegularRunnableExtension.java | 374 ++++++++++ .../lib/bazel/bzlmod/RunnableExtension.java | 64 ++ .../bzlmod/SingleExtensionEvalFunction.java | 687 ++---------------- .../LocalConfigPlatformFunction.java | 14 +- .../RepoFetchingSkyKeyComputeState.java | 149 ---- .../starlark/StarlarkRepositoryFunction.java | 90 +-- .../android/AndroidNdkRepositoryFunction.java | 33 +- .../android/AndroidSdkRepositoryFunction.java | 30 +- .../repository/LocalRepositoryFunction.java | 16 +- .../NewLocalRepositoryFunction.java | 30 +- .../RepositoryDelegatorFunction.java | 51 +- .../rules/repository/RepositoryFunction.java | 56 +- .../WorkerSkyFunctionEnvironment.java} | 41 +- .../skyframe/WorkerSkyKeyComputeState.java | 202 +++++ .../devtools/build/lib/analysis/util/BUILD | 3 +- .../devtools/build/lib/bazel/bzlmod/BUILD | 1 + .../devtools/build/lib/rules/repository/BUILD | 3 +- src/test/py/bazel/bzlmod/bazel_module_test.py | 33 + third_party/BUILD | 15 + 25 files changed, 1280 insertions(+), 1078 deletions(-) create mode 100644 src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InnateRunnableExtension.java create mode 100644 src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RegularRunnableExtension.java create mode 100644 src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RunnableExtension.java delete mode 100644 src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/RepoFetchingSkyKeyComputeState.java rename src/main/java/com/google/devtools/build/{lib/bazel/repository/starlark/RepoFetchingWorkerSkyFunctionEnvironment.java => skyframe/WorkerSkyFunctionEnvironment.java} (79%) create mode 100644 src/main/java/com/google/devtools/build/skyframe/WorkerSkyKeyComputeState.java diff --git a/MODULE.bazel b/MODULE.bazel index db00e2300ef9a5..ef58c90a20b741 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -89,8 +89,8 @@ maven.install( "com.google.auto:auto-common:1.2.1", "com.google.auto.service:auto-service:1.0", "com.google.auto.service:auto-service-annotations:1.0.1", - "com.google.auto.value:auto-value:1.8.2", - "com.google.auto.value:auto-value-annotations:1.9", + "com.google.auto.value:auto-value:1.11.0", + "com.google.auto.value:auto-value-annotations:1.11.0", "com.google.code.findbugs:jsr305:3.0.2", "com.google.code.gson:gson:2.9.0", "com.google.code.java-allocation-instrumenter:java-allocation-instrumenter:3.3.0", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 38d9b0544447de..2b412cd82afdfd 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1292,11 +1292,11 @@ "@@rules_jvm_external~//:extensions.bzl%maven": { "general": { "bzlTransitiveDigest": "6HjpYwTb4aw3ujkkpdKEvg9geToiH1ebaT6hmsvF5xw=", - "usagesDigest": "1ia58ODt3QzLkRngsv/TS0AzP8ijp5HDSJODwRvBAQ4=", + "usagesDigest": "TsHAEjOBFx1Rxo+pwx5k6ozGStFLDvAyERKhM74gF5E=", "recordedFileInputs": { "@@//src/tools/android/maven_android_install.json": "09bff3e33d291336046f7c9201630fb5e014f0e60b78b6f09b84e4f5f73ed04f", "@@rules_jvm_external~//rules_jvm_external_deps_install.json": "cafb5d2d8119391eb2b322ce3840d3352ea82d496bdb8cbd4b6779ec4d044dda", - "@@//maven_install.json": "2f6095079e532a5b0201191509db67706e9b809bc1721a8fba8ab9810481b867" + "@@//maven_install.json": "bfbd27561bcdb13f4ed9b7aabacee210c5425db368504082f1384ade5ac6a88d" }, "recordedDirentsInputs": {}, "envVariables": {}, @@ -1915,8 +1915,8 @@ "{ \"group\": \"com.google.auto\", \"artifact\": \"auto-common\", \"version\": \"1.2.1\" }", "{ \"group\": \"com.google.auto.service\", \"artifact\": \"auto-service\", \"version\": \"1.0\" }", "{ \"group\": \"com.google.auto.service\", \"artifact\": \"auto-service-annotations\", \"version\": \"1.0.1\" }", - "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value\", \"version\": \"1.8.2\" }", - "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value-annotations\", \"version\": \"1.9\" }", + "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value\", \"version\": \"1.11.0\" }", + "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value-annotations\", \"version\": \"1.11.0\" }", "{ \"group\": \"com.google.code.findbugs\", \"artifact\": \"jsr305\", \"version\": \"3.0.2\" }", "{ \"group\": \"com.google.code.gson\", \"artifact\": \"gson\", \"version\": \"2.9.0\" }", "{ \"group\": \"com.google.code.java-allocation-instrumenter\", \"artifact\": \"java-allocation-instrumenter\", \"version\": \"3.3.0\" }", @@ -2070,6 +2070,17 @@ "downloaded_file_path": "v1/org/apache/tomcat/tomcat-annotations-api/8.0.5/tomcat-annotations-api-8.0.5.jar" } }, + "com_google_auto_value_auto_value_annotations_1_11_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "sha256": "5a055ce4255333b3346e1a8703da5bf8ff049532286fdcd31712d624abe111dd", + "urls": [ + "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.11.0/auto-value-annotations-1.11.0.jar" + ], + "downloaded_file_path": "v1/com/google/auto/value/auto-value-annotations/1.11.0/auto-value-annotations-1.11.0.jar" + } + }, "com_android_tools_analytics_library_protos_30_1_3": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_file", @@ -3443,6 +3454,17 @@ "downloaded_file_path": "v1/org/mockito/mockito-core/5.4.0/mockito-core-5.4.0.jar" } }, + "com_google_auto_value_auto_value_1_11_0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "sha256": "aaf8d637bfed3c420436b9facf1b7a88d12c8785374e4202382783005319c2c3", + "urls": [ + "https://repo1.maven.org/maven2/com/google/auto/value/auto-value/1.11.0/auto-value-1.11.0.jar" + ], + "downloaded_file_path": "v1/com/google/auto/value/auto-value/1.11.0/auto-value-1.11.0.jar" + } + }, "com_google_guava_failureaccess_1_0_1": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_file", @@ -4508,8 +4530,8 @@ "{ \"group\": \"com.google.auto\", \"artifact\": \"auto-common\", \"version\": \"1.2.1\" }", "{ \"group\": \"com.google.auto.service\", \"artifact\": \"auto-service\", \"version\": \"1.0\" }", "{ \"group\": \"com.google.auto.service\", \"artifact\": \"auto-service-annotations\", \"version\": \"1.0.1\" }", - "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value\", \"version\": \"1.8.2\" }", - "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value-annotations\", \"version\": \"1.9\" }", + "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value\", \"version\": \"1.11.0\" }", + "{ \"group\": \"com.google.auto.value\", \"artifact\": \"auto-value-annotations\", \"version\": \"1.11.0\" }", "{ \"group\": \"com.google.code.findbugs\", \"artifact\": \"jsr305\", \"version\": \"3.0.2\" }", "{ \"group\": \"com.google.code.gson\", \"artifact\": \"gson\", \"version\": \"2.9.0\" }", "{ \"group\": \"com.google.code.java-allocation-instrumenter\", \"artifact\": \"java-allocation-instrumenter\", \"version\": \"3.3.0\" }", @@ -4841,17 +4863,6 @@ "downloaded_file_path": "v1/io/netty/netty-codec-socks/4.1.93.Final/netty-codec-socks-4.1.93.Final.jar" } }, - "com_google_auto_value_auto_value_1_8_2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "sha256": "2067b788d4c1c96fd621ad861053a5c4d8a801cfafc77fec20d49a6e9340a745", - "urls": [ - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value/1.8.2/auto-value-1.8.2.jar" - ], - "downloaded_file_path": "v1/com/google/auto/value/auto-value/1.8.2/auto-value-1.8.2.jar" - } - }, "com_google_auto_auto_common_1_2_1": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_file", @@ -4896,17 +4907,6 @@ "downloaded_file_path": "v1/net/bytebuddy/byte-buddy/1.14.5/byte-buddy-1.14.5.jar" } }, - "com_google_auto_value_auto_value_annotations_1_9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "sha256": "fa5469f4c44ee598a2d8f033ab0a9dcbc6498a0c5e0c998dfa0c2adf51358044", - "urls": [ - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.9/auto-value-annotations-1.9.jar" - ], - "downloaded_file_path": "v1/com/google/auto/value/auto-value-annotations/1.9/auto-value-annotations-1.9.jar" - } - }, "com_google_errorprone_error_prone_annotations_2_22_0": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_file", diff --git a/maven_install.json b/maven_install.json index 3728003960923b..d05812f265ef7f 100644 --- a/maven_install.json +++ b/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -217313117, - "__RESOLVED_ARTIFACTS_HASH": 1427942467, + "__INPUT_ARTIFACTS_HASH": -2030624926, + "__RESOLVED_ARTIFACTS_HASH": 1927415688, "conflict_resolution": { "com.google.code.gson:gson:2.8.9": "com.google.code.gson:gson:2.9.0", "com.google.errorprone:error_prone_annotations:2.3.2": "com.google.errorprone:error_prone_annotations:2.22.0", @@ -92,15 +92,15 @@ }, "com.google.auto.value:auto-value": { "shasums": { - "jar": "2067b788d4c1c96fd621ad861053a5c4d8a801cfafc77fec20d49a6e9340a745" + "jar": "aaf8d637bfed3c420436b9facf1b7a88d12c8785374e4202382783005319c2c3" }, - "version": "1.8.2" + "version": "1.11.0" }, "com.google.auto.value:auto-value-annotations": { "shasums": { - "jar": "fa5469f4c44ee598a2d8f033ab0a9dcbc6498a0c5e0c998dfa0c2adf51358044" + "jar": "5a055ce4255333b3346e1a8703da5bf8ff049532286fdcd31712d624abe111dd" }, - "version": "1.9" + "version": "1.11.0" }, "com.google.auto:auto-common": { "shasums": { @@ -1277,23 +1277,33 @@ "com.google.auto.service" ], "com.google.auto.value:auto-value": [ - "autovalue.shaded.com.google$.auto.common", - "autovalue.shaded.com.google$.auto.service", - "autovalue.shaded.com.google$.common.annotations", - "autovalue.shaded.com.google$.common.base", - "autovalue.shaded.com.google$.common.collect", - "autovalue.shaded.com.google$.common.hash", - "autovalue.shaded.com.google$.common.math", - "autovalue.shaded.com.google$.common.primitives", - "autovalue.shaded.com.google$.common.reflect", - "autovalue.shaded.com.google$.errorprone.annotations", - "autovalue.shaded.com.google$.errorprone.annotations.concurrent", - "autovalue.shaded.com.google$.escapevelocity", - "autovalue.shaded.com.google$.j2objc.annotations", - "autovalue.shaded.com.squareup.javapoet$", - "autovalue.shaded.net.ltgt.gradle.incap$", - "autovalue.shaded.org.checkerframework$.checker.nullness.qual", - "autovalue.shaded.org.checkerframework$.framework.qual", + "autovalue.shaded.com.google.auto.common", + "autovalue.shaded.com.google.auto.service", + "autovalue.shaded.com.google.common.annotations", + "autovalue.shaded.com.google.common.base", + "autovalue.shaded.com.google.common.cache", + "autovalue.shaded.com.google.common.collect", + "autovalue.shaded.com.google.common.escape", + "autovalue.shaded.com.google.common.eventbus", + "autovalue.shaded.com.google.common.graph", + "autovalue.shaded.com.google.common.hash", + "autovalue.shaded.com.google.common.html", + "autovalue.shaded.com.google.common.io", + "autovalue.shaded.com.google.common.math", + "autovalue.shaded.com.google.common.net", + "autovalue.shaded.com.google.common.primitives", + "autovalue.shaded.com.google.common.reflect", + "autovalue.shaded.com.google.common.util.concurrent", + "autovalue.shaded.com.google.common.xml", + "autovalue.shaded.com.google.errorprone.annotations", + "autovalue.shaded.com.google.errorprone.annotations.concurrent", + "autovalue.shaded.com.google.escapevelocity", + "autovalue.shaded.com.google.j2objc.annotations", + "autovalue.shaded.com.squareup.javapoet", + "autovalue.shaded.net.ltgt.gradle.incap", + "autovalue.shaded.org.checkerframework.checker.nullness.qual", + "autovalue.shaded.org.checkerframework.framework.qual", + "autovalue.shaded.org.objectweb.asm", "com.google.auto.value.extension", "com.google.auto.value.extension.memoized.processor", "com.google.auto.value.extension.serializable.processor", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/BUILD index 815dee82de214c..ae5d5a454476d0 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/BUILD @@ -29,6 +29,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/authandtls", "//src/main/java/com/google/devtools/build/lib/authandtls/credentialhelper", "//src/main/java/com/google/devtools/build/lib/authandtls/credentialhelper:credential_module", + "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:extension_eval_impl", "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:inspection_impl", "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:registry", "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD index 02b3a879d57ee6..511a6ff0eedd0b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD @@ -218,7 +218,6 @@ java_library( "RegistryFunction.java", "RepoSpecFunction.java", "Selection.java", - "SingleExtensionEvalFunction.java", "SingleExtensionFunction.java", "SingleExtensionUsagesFunction.java", "StarlarkBazelModule.java", @@ -234,9 +233,7 @@ java_library( ":module_extension", ":module_extension_metadata", ":registry", - ":repo_rule_creator", ":resolution", - ":root_module_file_fixup", "//src/main/java/com/google/devtools/build/docgen/annot", "//src/main/java/com/google/devtools/build/lib:runtime", "//src/main/java/com/google/devtools/build/lib/actions:file_metadata", @@ -256,27 +253,70 @@ java_library( "//src/main/java/com/google/devtools/build/lib/rules:repository/repo_recorded_input", "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_directory_value", "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function", - "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value", "//src/main/java/com/google/devtools/build/lib/skyframe:client_environment_function", "//src/main/java/com/google/devtools/build/lib/skyframe:client_environment_value", "//src/main/java/com/google/devtools/build/lib/skyframe:package_lookup_function", "//src/main/java/com/google/devtools/build/lib/skyframe:package_lookup_value", "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value", + "//src/main/java/com/google/devtools/build/lib/vfs", + "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment", + "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", + "//src/main/java/net/starlark/java/annot", + "//src/main/java/net/starlark/java/eval", + "//src/main/java/net/starlark/java/spelling", + "//src/main/java/net/starlark/java/syntax", + "//src/main/protobuf:failure_details_java_proto", + "//third_party:auto_value", + "//third_party:gson", + "//third_party:guava", + "//third_party:jsr305", + ], +) + +java_library( + name = "extension_eval_impl", + srcs = [ + "InnateRunnableExtension.java", + "RegularRunnableExtension.java", + "RunnableExtension.java", + "SingleExtensionEvalFunction.java", + ], + deps = [ + ":common", + ":exception", + ":module_extension", + ":module_extension_metadata", + ":repo_rule_creator", + ":resolution", + ":resolution_impl", + ":root_module_file_fixup", + "//src/main/java/com/google/devtools/build/lib:runtime", + "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", + "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader", + "//src/main/java/com/google/devtools/build/lib/bazel/repository/starlark", + "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/events", + "//src/main/java/com/google/devtools/build/lib/packages", + "//src/main/java/com/google/devtools/build/lib/packages/semantics", + "//src/main/java/com/google/devtools/build/lib/profiler", + "//src/main/java/com/google/devtools/build/lib/rules:repository/repo_recorded_input", + "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function", + "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value", + "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value", "//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value", "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster", "//src/main/java/com/google/devtools/build/lib/util", "//src/main/java/com/google/devtools/build/lib/util:os", "//src/main/java/com/google/devtools/build/lib/vfs", - "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment", "//src/main/java/com/google/devtools/build/skyframe", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", - "//src/main/java/net/starlark/java/annot", "//src/main/java/net/starlark/java/eval", "//src/main/java/net/starlark/java/spelling", "//src/main/java/net/starlark/java/syntax", "//src/main/protobuf:failure_details_java_proto", "//third_party:auto_value", - "//third_party:gson", "//third_party:guava", "//third_party:jsr305", ], diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InnateRunnableExtension.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InnateRunnableExtension.java new file mode 100644 index 00000000000000..f85097168bba3f --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InnateRunnableExtension.java @@ -0,0 +1,295 @@ +// Copyright 2024 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +package com.google.devtools.build.lib.bazel.bzlmod; + +import static com.google.common.collect.ImmutableList.toImmutableList; +import static com.google.common.collect.ImmutableSet.toImmutableSet; + +import com.google.auto.value.AutoBuilder; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableTable; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryModule.RepositoryRuleFunction; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.cmdline.LabelSyntaxException; +import com.google.devtools.build.lib.cmdline.RepositoryMapping; +import com.google.devtools.build.lib.packages.NoSuchPackageException; +import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.RuleFactory.InvalidRuleException; +import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions; +import com.google.devtools.build.lib.server.FailureDetails.ExternalDeps.Code; +import com.google.devtools.build.lib.skyframe.BzlLoadFunction; +import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; +import com.google.devtools.build.lib.skyframe.BzlLoadValue; +import com.google.devtools.build.lib.util.Fingerprint; +import com.google.devtools.build.skyframe.SkyFunction.Environment; +import com.google.devtools.build.skyframe.SkyframeLookupResult; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map.Entry; +import java.util.Optional; +import javax.annotation.Nullable; +import net.starlark.java.eval.Dict; +import net.starlark.java.eval.EvalException; +import net.starlark.java.eval.Starlark; +import net.starlark.java.eval.StarlarkSemantics; +import net.starlark.java.eval.StarlarkThread; +import net.starlark.java.spelling.SpellChecker; + +/** + * A fabricated module extension "innate" to each module, used to generate all repos defined using + * {@code use_repo_rule}. + */ +final class InnateRunnableExtension implements RunnableExtension { + private final ModuleKey moduleKey; + private final ImmutableList repos; + private final byte[] transitiveBzlDigest; + private final BlazeDirectories directories; + + InnateRunnableExtension( + ModuleKey moduleKey, + ImmutableList repos, + byte[] transitiveBzlDigest, + BlazeDirectories directories) { + this.moduleKey = moduleKey; + this.repos = repos; + this.transitiveBzlDigest = transitiveBzlDigest; + this.directories = directories; + } + + /** Returns null if a Skyframe restart is needed. */ + @Nullable + static InnateRunnableExtension load( + ModuleExtensionId extensionId, + SingleExtensionUsagesValue usagesValue, + StarlarkSemantics starlarkSemantics, + Environment env, + BlazeDirectories directories) + throws InterruptedException, ExternalDepsException { + // An innate extension should have a singular usage. + if (usagesValue.getExtensionUsages().size() > 1) { + throw ExternalDepsException.withMessage( + Code.BAD_MODULE, + "innate module extension %s is used by multiple modules: %s", + extensionId, + usagesValue.getExtensionUsages().keySet()); + } + ModuleKey moduleKey = Iterables.getOnlyElement(usagesValue.getExtensionUsages().keySet()); + ImmutableList tags = + Iterables.getOnlyElement(usagesValue.getExtensionUsages().values()).getTags(); + RepositoryMapping repoMapping = usagesValue.getRepoMappings().get(moduleKey); + + // Each tag of this usage defines a repo. The name of the tag is of the form + // "%". Collect the .bzl files referenced and load them. + Label.RepoContext repoContext = Label.RepoContext.of(repoMapping.ownerRepo(), repoMapping); + ArrayList repoBuilders = new ArrayList<>(tags.size()); + for (Tag tag : tags) { + Iterator parts = Splitter.on('%').split(tag.getTagName()).iterator(); + InnateExtensionRepo.Builder repoBuilder = InnateExtensionRepo.builder().tag(tag); + repoBuilders.add(repoBuilder); + try { + Label label = Label.parseWithRepoContext(parts.next(), repoContext); + BzlLoadFunction.checkValidLoadLabel(label, starlarkSemantics); + repoBuilder.bzlLabel(label).ruleName(parts.next()); + } catch (LabelSyntaxException e) { + throw ExternalDepsException.withCauseAndMessage( + Code.BAD_MODULE, e, "bad repo rule .bzl file label at %s", tag.getLocation()); + } + } + ImmutableSet loadKeys = + repoBuilders.stream() + .map(r -> BzlLoadValue.keyForBzlmod(r.bzlLabel())) + .collect(toImmutableSet()); + HashSet