From 25aa07585ce01d02237415747cf0b181738d8bed Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 28 Jul 2026 11:40:55 -0700 Subject: [PATCH] [9.3.0] Add --incompatible_require_repo_extension_metadata (https://github.com/bazelbuild/bazel/pull/30202) This flag allows you to enforce that all module_extensions and repository_rules return metadata. This metadata is used to determine how to handle the extension for the lockfile and R2C2 respectively. You can either error on any of these missing metadata, or just ones defined in the root module. Eventually it would be ideal to flip this but that likely requires a lot of backfilling (that we want to do anyways) Closes #30202. Closees https://github.com/bazelbuild/bazel/issues/30464 PiperOrigin-RevId: 955379016 Change-Id: I8facf9291188f503d8f82e77e8f63e20cec9a828 (cherry picked from commit d194e06017497c753e0dd76e5e33e82a2f4d0b0b) --- .../com/google/devtools/build/lib/bazel/BUILD | 1 + .../lib/bazel/BazelRepositoryModule.java | 9 + .../devtools/build/lib/bazel/bzlmod/BUILD | 1 + .../bazel/bzlmod/InnateRunnableExtension.java | 4 +- .../bzlmod/RegularRunnableExtension.java | 29 ++- .../lib/bazel/bzlmod/RunnableExtension.java | 4 +- .../bzlmod/SingleExtensionEvalFunction.java | 8 +- .../devtools/build/lib/bazel/repository/BUILD | 11 + .../repository/RepoMetadataRequirements.java | 26 +++ .../repository/RepositoryFetchFunction.java | 42 +++- .../bazel/repository/RepositoryOptions.java | 42 ++++ .../build/lib/skyframe/packages/BUILD | 1 + .../skyframe/packages/BazelPackageLoader.java | 4 + .../build/lib/analysis/util/AnalysisMock.java | 5 + .../devtools/build/lib/analysis/util/BUILD | 1 + .../devtools/build/lib/bazel/bzlmod/BUILD | 1 + .../build/lib/bazel/bzlmod/DiscoveryTest.java | 4 + .../bzlmod/ModuleExtensionResolutionTest.java | 199 ++++++++++++++++++ .../bazel/bzlmod/ModuleFileFunctionTest.java | 4 + .../devtools/build/lib/bazel/repository/BUILD | 1 + .../repository/RepositoryDelegatorTest.java | 3 + ...ractCollectPackagesUnderDirectoryTest.java | 6 +- .../google/devtools/build/lib/skyframe/BUILD | 8 + .../ContainingPackageLookupFunctionTest.java | 4 + .../build/lib/skyframe/FileFunctionTest.java | 4 + .../skyframe/PackageLookupFunctionTest.java | 4 + 26 files changed, 418 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/google/devtools/build/lib/bazel/repository/RepoMetadataRequirements.java 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 73a5a718661b66..2027ee61ed3894 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/BUILD @@ -42,6 +42,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:vendor", "//src/main/java/com/google/devtools/build/lib/bazel/commands", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository:utils", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java index 93bdc5306138d8..d4d7a1a180542b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java @@ -62,12 +62,14 @@ import com.google.devtools.build.lib.bazel.commands.ModCommand; import com.google.devtools.build.lib.bazel.commands.VendorCommand; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.BazelCompatibilityMode; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.CheckDirectDepsMode; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.LockfileMode; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RepositoryOverride; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.bazel.repository.RepositoryUtils; import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; @@ -148,6 +150,8 @@ public class BazelRepositoryModule extends BlazeModule { private CheckDirectDepsMode checkDirectDepsMode = CheckDirectDepsMode.WARNING; private BazelCompatibilityMode bazelCompatibilityMode = BazelCompatibilityMode.ERROR; private LockfileMode bazelLockfileMode = LockfileMode.UPDATE; + private RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode = + RequireRepoExtensionMetadataMode.FALSE; private Clock clock; private Instant lastRegistryInvalidation = Instant.EPOCH; @@ -294,8 +298,10 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException { singleExtensionEvalFunction.setDownloadManager(downloadManager); RepositoryOptions repoOptions = env.getOptions().getOptions(RepositoryOptions.class); + requireRepoExtensionMetadataMode = RequireRepoExtensionMetadataMode.FALSE; if (repoOptions != null) { downloadManager.setDisableDownload(repoOptions.disableDownload); + requireRepoExtensionMetadataMode = repoOptions.requireRepoExtensionMetadata; if (repoOptions.repositoryDownloaderRetries >= 0) { downloadManager.setRetries(repoOptions.repositoryDownloaderRetries); } @@ -760,6 +766,9 @@ public ImmutableList getPrecomputedValues() { BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, checkDirectDepsMode), PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, bazelCompatibilityMode), + PrecomputedValue.injected( + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA, + requireRepoExtensionMetadataMode), PrecomputedValue.injected(BazelLockFileFunction.LOCKFILE_MODE, bazelLockfileMode), PrecomputedValue.injected(RepositoryDirectoryValue.IS_VENDOR_COMMAND, false), PrecomputedValue.injected(RepositoryDirectoryValue.VENDOR_DIRECTORY, vendorDirectory), 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 be8972fecf5414..9d5f7a2dd32726 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 @@ -331,6 +331,7 @@ java_library( "//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:repo_definition", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//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", 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 index b49e5f1f3d93e5..b0d7d7142f69dc 100644 --- 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 @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.bazel.repository.RepoRule; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryModule.StarlarkRepoRule; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; @@ -159,7 +160,8 @@ public RunModuleExtensionResult run( StarlarkSemantics starlarkSemantics, ModuleExtensionId extensionId, RepositoryMapping mainRepositoryMapping, - Facts facts) + Facts facts, + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode) throws InterruptedException, ExternalDepsException { Object exported = loadedBzl.getModule().getGlobal(ruleName); if (exported == null) { diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RegularRunnableExtension.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RegularRunnableExtension.java index a8d0009491c5cd..1a6c7487273a20 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RegularRunnableExtension.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RegularRunnableExtension.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; import com.google.devtools.build.lib.bazel.repository.starlark.NeedsSkyframeRestartException; import com.google.devtools.build.lib.cmdline.BazelModuleContext; @@ -223,7 +224,8 @@ public RunModuleExtensionResult run( StarlarkSemantics starlarkSemantics, ModuleExtensionId extensionId, RepositoryMapping mainRepositoryMapping, - Facts facts) + Facts facts, + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode) throws InterruptedException, ExternalDepsException { // See below (the `catch CancellationException` clause) for why there's a `while` loop here. while (true) { @@ -239,7 +241,8 @@ public RunModuleExtensionResult run( starlarkSemantics, extensionId, mainRepositoryMapping, - facts)); + facts, + requireRepoExtensionMetadataMode)); } catch (ExecutionException e) { Throwables.throwIfInstanceOf(e.getCause(), ExternalDepsException.class); Throwables.throwIfInstanceOf(e.getCause(), InterruptedException.class); @@ -260,7 +263,8 @@ private RunModuleExtensionResult runInternal( StarlarkSemantics starlarkSemantics, ModuleExtensionId extensionId, RepositoryMapping mainRepositoryMapping, - Facts facts) + Facts facts, + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode) throws InterruptedException, ExternalDepsException { env.getListener().post(ModuleExtensionEvaluationProgress.ongoing(extensionId, "starting")); ModuleExtensionEvalStarlarkThreadContext threadContext = @@ -301,6 +305,15 @@ private RunModuleExtensionResult runInternal( if (returnValue instanceof ModuleExtensionMetadata retMetadata) { moduleExtensionMetadata = retMetadata; } else { + if (shouldRequireMetadata(requireRepoExtensionMetadataMode, extensionId)) { + throw ExternalDepsException.withMessage( + ExternalDeps.Code.EXTENSION_EVAL_ERROR, + "module extension %s did not return extension_metadata (implementation at %s)," + + " but --incompatible_require_repo_extension_metadata=%s requires it", + extensionId, + extension.implementation().getLocation(), + requireRepoExtensionMetadataMode); + } moduleExtensionMetadata = ModuleExtensionMetadata.DEFAULT; } } catch (NeedsSkyframeRestartException e) { @@ -328,6 +341,16 @@ private RunModuleExtensionResult runInternal( } } + private static boolean shouldRequireMetadata( + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode, + ModuleExtensionId extensionId) { + return switch (requireRepoExtensionMetadataMode) { + case FALSE -> false; + case ALL -> true; + case ROOT -> extensionId.bzlFileLabel().getRepository().isMain(); + }; + } + private ModuleExtensionContext createContext( Environment env, SingleExtensionUsagesValue usagesValue, diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RunnableExtension.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RunnableExtension.java index fc5c6b2e4bb78c..b13241099ed942 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RunnableExtension.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/RunnableExtension.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.rules.repository.RepoRecordedInput; import com.google.devtools.build.skyframe.SkyFunction.Environment; @@ -54,7 +55,8 @@ RunModuleExtensionResult run( StarlarkSemantics starlarkSemantics, ModuleExtensionId extensionId, RepositoryMapping mainRepositoryMapping, - Facts facts) + Facts facts, + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode) throws InterruptedException, ExternalDepsException; /* Holds the result data from running a module extension */ diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java index 5a7afbbe936aa7..17d7ec1b614b81 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java @@ -16,13 +16,16 @@ package com.google.devtools.build.lib.bazel.bzlmod; import static com.google.common.collect.ImmutableBiMap.toImmutableBiMap; +import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.joining; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.bazel.bzlmod.RunnableExtension.RunModuleExtensionResult; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.LockfileMode; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; import com.google.devtools.build.lib.bazel.repository.starlark.NeedsSkyframeRestartException; import com.google.devtools.build.lib.cmdline.RepositoryName; @@ -98,6 +101,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) if (starlarkSemantics == null) { return null; } + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode = + requireNonNull(RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.get(env)); RepositoryMappingValue mainRepoMappingValue = (RepositoryMappingValue) env.getValue(RepositoryMappingValue.key(RepositoryName.MAIN)); if (mainRepoMappingValue == null) { @@ -209,7 +214,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) starlarkSemantics, extensionId, mainRepoMappingValue.repositoryMapping(), - lockfileFacts); + lockfileFacts, + requireRepoExtensionMetadataMode); } catch (ExternalDepsException e) { throw new SingleExtensionEvalFunctionException(e); } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD index 92344235409587..04d0adad1e76ea 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD @@ -39,6 +39,15 @@ java_library( ], ) +java_library( + name = "repo_metadata_requirements", + srcs = ["RepoMetadataRequirements.java"], + deps = [ + ":repository_options", + "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value", + ], +) + java_library( name = "repository_fetch_function", srcs = [ @@ -49,6 +58,8 @@ java_library( ":exception", ":repo_definition", ":repo_definition_value", + ":repo_metadata_requirements", + ":repository_options", ":repository_resolved_event", ":utils", "//src/main/java/com/google/devtools/build/lib:runtime", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepoMetadataRequirements.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepoMetadataRequirements.java new file mode 100644 index 00000000000000..446cd190c3d870 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepoMetadataRequirements.java @@ -0,0 +1,26 @@ +// Copyright 2026 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.repository; + +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; +import com.google.devtools.build.lib.skyframe.PrecomputedValue; + +/** Skyframe inputs controlling repo and module extension metadata enforcement. */ +public final class RepoMetadataRequirements { + public static final PrecomputedValue.Precomputed + REQUIRE_REPO_EXTENSION_METADATA = + new PrecomputedValue.Precomputed<>("require_repo_extension_metadata"); + + private RepoMetadataRequirements() {} +} diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFetchFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFetchFunction.java index fc87cb21514a65..ed953eb106a8e8 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFetchFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryFetchFunction.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride; import com.google.devtools.build.lib.bazel.bzlmod.VendorFileValue; import com.google.devtools.build.lib.bazel.repository.RepositoryFunctionException.AlreadyReportedRepositoryAccessException; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache.CandidateRepo; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; @@ -600,6 +601,8 @@ private FetchResult fetch( if (env.valuesMissing()) { return null; } + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode = + checkNotNull(RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.get(env)); PathPackageLocator packageLocator = PrecomputedValue.PATH_PACKAGE_LOCATOR.get(env); if (env.valuesMissing()) { @@ -683,7 +686,13 @@ private FetchResult fetch( RepoMetadata.Reproducibility.NO, Dict.cast(dict, String.class, Object.class, "return value")); case RepoMetadata rm -> rm; - default -> RepoMetadata.NONREPRODUCIBLE; + default -> { + if (shouldRequireRepoMetadata(requireRepoExtensionMetadataMode, repoDefinition)) { + throwDefaultRepoMetadataError( + repoDefinition, requireRepoExtensionMetadataMode, env); + } + yield RepoMetadata.NONREPRODUCIBLE; + } }; RepositoryResolvedEvent resolved = new RepositoryResolvedEvent(repoDefinition, repoMetadata.attrsForReproducibility()); @@ -743,6 +752,37 @@ private FetchResult fetch( return new FetchResult(recordedInputValues, repoMetadata.reproducible()); } + private static boolean shouldRequireRepoMetadata( + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode, + RepoDefinition repoDefinition) { + return switch (requireRepoExtensionMetadataMode) { + case FALSE -> false; + case ALL -> true; + case ROOT -> repoDefinition.repoRule().id().bzlFileLabel().getRepository().isMain(); + }; + } + + private static void throwDefaultRepoMetadataError( + RepoDefinition repoDefinition, + RequireRepoExtensionMetadataMode requireRepoExtensionMetadataMode, + Environment env) + throws RepositoryFunctionException { + String definitionInformation = + RepositoryResolvedEvent.getRuleDefinitionInformation(repoDefinition); + String message = + ("repository rule for repo '%s' did not return repo_metadata (implementation at %s), but" + + " --incompatible_require_repo_extension_metadata=%s requires it") + .formatted( + repoDefinition.name(), + repoDefinition.repoRule().impl().getLocation(), + requireRepoExtensionMetadataMode); + env.getListener().handle(Event.error(message)); + env.getListener().handle(Event.info(definitionInformation)); + throw new RepositoryFunctionException( + new AlreadyReportedRepositoryAccessException(new IOException(message)), + Transience.PERSISTENT); + } + @Nullable private RepositoryDirectoryValue setupOverride( PathFragment sourcePath, Environment env, Path repoRoot, RepositoryName repoName) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java index ff9919394358c3..a27e72ffe8213f 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.util.OptionsUtils; import com.google.devtools.build.lib.vfs.PathFragment; +import com.google.devtools.common.options.BoolOrEnumConverter; import com.google.devtools.common.options.Converter; import com.google.devtools.common.options.Converters; import com.google.devtools.common.options.Converters.DurationConverter; @@ -341,6 +342,20 @@ verified by hashes stored in the registry (and thus pinned by the lockfile). + " warning when mismatch detected.") public BazelCompatibilityMode bazelCompatibilityMode; + @Option( + name = "incompatible_require_repo_extension_metadata", + defaultValue = "false", + converter = RequireRepoExtensionMetadataMode.Converter.class, + documentationCategory = OptionDocumentationCategory.BZLMOD, + effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS}, + metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}, + help = + "Require repository rules and module extensions to return explicit metadata. Valid values" + + " are `false` to disable the check, `all` to require metadata everywhere, or `root`" + + " to require metadata only for repo rules and extensions defined in the root" + + " module.") + public RequireRepoExtensionMetadataMode requireRepoExtensionMetadata; + @Option( name = "lockfile_mode", converter = LockfileMode.Converter.class, @@ -397,6 +412,33 @@ public Converter() { } } + /** An enum for specifying when repo and extension metadata is required. */ + public enum RequireRepoExtensionMetadataMode { + FALSE, // Don't require metadata. + ALL, // Require metadata everywhere. + ROOT; // Require metadata for repo rules and extensions defined in the root module. + + @Override + public String toString() { + return switch (this) { + case FALSE -> "false"; + case ALL -> "all"; + case ROOT -> "root"; + }; + } + + /** Converts to {@link RequireRepoExtensionMetadataMode}. */ + public static class Converter extends BoolOrEnumConverter { + public Converter() { + super( + RequireRepoExtensionMetadataMode.class, + "repo extension metadata mode", + RequireRepoExtensionMetadataMode.ALL, + RequireRepoExtensionMetadataMode.FALSE); + } + } + } + /** An enum for specifying how to use the lockfile. */ public enum LockfileMode { OFF, // Don't use the lockfile at all. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD index bf6c09b76e8f00..e5b291d6520007 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD @@ -91,6 +91,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution_impl", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_value", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java index 8919c0a6507358..5bfab8c1a07af9 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionValue; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache; @@ -119,6 +120,9 @@ private Builder(Root workspaceDir, Path installBase, Path outputBase) { PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, RepositoryOptions.BazelCompatibilityMode.OFF), + PrecomputedValue.injected( + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA, + RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE), PrecomputedValue.injected( BazelLockFileFunction.LOCKFILE_MODE, RepositoryOptions.LockfileMode.OFF), PrecomputedValue.injected( diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java index e4764c82c62d11..ed6ec7fd30fda2 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java @@ -35,7 +35,9 @@ import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionValue; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.BazelCompatibilityMode; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.CheckDirectDepsMode; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.LockfileMode; @@ -234,6 +236,9 @@ public ImmutableList getPrecomputedValues() { BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, BazelCompatibilityMode.ERROR), + PrecomputedValue.injected( + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA, + RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE), PrecomputedValue.injected(BazelLockFileFunction.LOCKFILE_MODE, LockfileMode.UPDATE)); } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD index 45f2d506396fd3..25e3da7ac6d85c 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD @@ -86,6 +86,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution_impl", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_value", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD index e0d91c437e04bd..46927d8c920346 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD @@ -45,6 +45,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:serialization", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_value", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java index 0d983a5f1e2cfd..e9844802cc1d07 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java @@ -32,7 +32,9 @@ import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileValue.RootModuleFileValue; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionValue; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.LockfileMode; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache; import com.google.devtools.build.lib.bazel.repository.downloader.Checksum; @@ -204,6 +206,8 @@ private void setUpWithBuiltinModules(ImmutableMap b RepositoryDirectoryValue.FORCE_FETCH.set( differencer, RepositoryDirectoryValue.FORCE_FETCH_DISABLED); RepositoryDirectoryValue.VENDOR_DIRECTORY.set(differencer, Optional.empty()); + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.set( + differencer, RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE); PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, packageLocator.get()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, false); diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java index 3ecb817886814c..1d57c09e246a57 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java @@ -24,6 +24,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; @@ -2693,6 +2695,203 @@ public void facts_nestedTooDeeply() throws Exception { assertContainsEvent("Facts cannot be nested more than 7 levels deep"); } + @Test + public void requireRepoExtensionMetadata_defaultAllowsModuleExtensionDefault() throws Exception { + var result = evaluateSimpleModuleExtension(""); + + if (result.hasError()) { + throw result.getError().getException(); + } + } + + @Test + public void requireRepoExtensionMetadata_allErrorsForModuleExtensionDefault() throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ALL); + reporter.removeHandler(failFastHandler); + + var result = evaluateSimpleModuleExtension(""); + + assertThat(result.hasError()).isTrue(); + assertThat(result.getError().getException()) + .hasMessageThat() + .contains("did not return extension_metadata"); + assertThat(result.getError().getException()) + .hasMessageThat() + .contains("--incompatible_require_repo_extension_metadata=all requires it"); + } + + @Test + public void requireRepoExtensionMetadata_rootErrorsForRootModuleExtensionDefault() + throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ROOT); + reporter.removeHandler(failFastHandler); + + var result = evaluateSimpleModuleExtension(""); + + assertThat(result.hasError()).isTrue(); + assertThat(result.getError().getException()) + .hasMessageThat() + .contains("did not return extension_metadata"); + assertThat(result.getError().getException()) + .hasMessageThat() + .contains("--incompatible_require_repo_extension_metadata=root requires it"); + } + + @Test + public void requireRepoExtensionMetadata_rootAllowsDepDefinedModuleExtensionUsedByRootModule() + throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ROOT); + scratch.overwriteFile( + "MODULE.bazel", + "module(name='root')", + "bazel_dep(name='foo', version='1.0')", + "ext = use_extension('@foo//:defs.bzl', 'ext')"); + registry.addModule(createModuleKey("foo", "1.0"), "module(name='foo', version='1.0')"); + scratch.file(moduleRoot.getRelative("foo+1.0/REPO.bazel").getPathString()); + scratch.file(moduleRoot.getRelative("foo+1.0/BUILD").getPathString()); + scratch.file( + moduleRoot.getRelative("foo+1.0/defs.bzl").getPathString(), + "def _ext_impl(ctx):", + " pass", + "ext = module_extension(implementation=_ext_impl)"); + scratch.overwriteFile("BUILD"); + invalidatePackages(false); + + ModuleExtensionId extensionId = + ModuleExtensionId.create( + Label.parseCanonical("@@foo+//:defs.bzl"), "ext", Optional.empty()); + EvaluationResult result = + SkyframeExecutorTestUtils.evaluate( + skyframeExecutor, SingleExtensionValue.key(extensionId), false, reporter); + + if (result.hasError()) { + throw result.getError().getException(); + } + } + + @Test + public void requireRepoExtensionMetadata_allAllowsExplicitModuleExtensionMetadata() + throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ALL); + + var result = evaluateSimpleModuleExtension("return ctx.extension_metadata()"); + + if (result.hasError()) { + throw result.getError().getException(); + } + } + + @Test + public void requireRepoExtensionMetadata_allErrorsForRepoRuleDefault() throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ALL); + setupRootUseRepoRuleReturning(""); + reporter.removeHandler(failFastHandler); + + EvaluationResult result = loadRootDataBzl(); + + assertThat(result.hasError()).isTrue(); + assertContainsEvent("did not return repo_metadata"); + assertContainsEvent("--incompatible_require_repo_extension_metadata=all requires it"); + } + + @Test + public void requireRepoExtensionMetadata_rootErrorsForRootRepoRuleDefault() throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ROOT); + setupRootUseRepoRuleReturning(""); + reporter.removeHandler(failFastHandler); + + EvaluationResult result = loadRootDataBzl(); + + assertThat(result.hasError()).isTrue(); + assertContainsEvent("did not return repo_metadata"); + assertContainsEvent("--incompatible_require_repo_extension_metadata=root requires it"); + } + + @Test + public void requireRepoExtensionMetadata_rootAllowsDepDefinedRepoRuleUsedByRootModule() + throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ROOT); + scratch.overwriteFile( + "MODULE.bazel", + "module(name='root')", + "bazel_dep(name='foo', version='1.0')", + "repo = use_repo_rule('@foo//:repo.bzl', 'repo')", + "repo(name = 'gen')"); + scratch.overwriteFile("BUILD"); + scratch.file("data.bzl", "load('@gen//:data.bzl', repo_data = 'data')", "data = repo_data"); + registry.addModule(createModuleKey("foo", "1.0"), "module(name='foo', version='1.0')"); + scratch.file(moduleRoot.getRelative("foo+1.0/REPO.bazel").getPathString()); + scratch.file(moduleRoot.getRelative("foo+1.0/BUILD").getPathString()); + scratch.file( + moduleRoot.getRelative("foo+1.0/repo.bzl").getPathString(), + "def _repo_impl(ctx):", + " ctx.file('BUILD')", + " ctx.file('data.bzl', \"data = 'ok'\")", + "repo = repository_rule(implementation = _repo_impl)"); + invalidatePackages(false); + + EvaluationResult result = loadRootDataBzl(); + + if (result.hasError()) { + throw result.getError().getException(); + } + } + + @Test + public void requireRepoExtensionMetadata_allAllowsExplicitRepoMetadata() throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ALL); + setupRootUseRepoRuleReturning("return ctx.repo_metadata(reproducible = True)"); + + EvaluationResult result = loadRootDataBzl(); + + if (result.hasError()) { + throw result.getError().getException(); + } + } + + @Test + public void requireRepoExtensionMetadata_allAllowsLegacyRepoMetadataDict() throws Exception { + setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode.ALL); + setupRootUseRepoRuleReturning("return {}"); + + EvaluationResult result = loadRootDataBzl(); + + if (result.hasError()) { + throw result.getError().getException(); + } + } + + private void setRequireRepoExtensionMetadataMode(RequireRepoExtensionMetadataMode mode) + throws Exception { + skyframeExecutor.injectExtraPrecomputedValues( + ImmutableList.of( + PrecomputedValue.injected( + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA, mode))); + } + + private void setupRootUseRepoRuleReturning(String returnStatement) throws Exception { + scratch.overwriteFile( + "MODULE.bazel", "repo = use_repo_rule('//:repo.bzl', 'repo')", "repo(name = 'foo')"); + scratch.overwriteFile("BUILD"); + scratch.file("data.bzl", "load('@foo//:data.bzl', repo_data = 'data')", "data = repo_data"); + scratch.file( + "repo.bzl", + "def _repo_impl(ctx):", + " ctx.file('BUILD')", + " ctx.file('data.bzl', \"data = 'ok'\")", + returnStatement.indent(2), + "repo = repository_rule(implementation = _repo_impl)"); + invalidatePackages(false); + } + + private EvaluationResult loadRootDataBzl() throws Exception { + return SkyframeExecutorTestUtils.evaluate( + skyframeExecutor, + BzlLoadValue.keyForBuild(Label.parseCanonical("//:data.bzl")), + false, + reporter); + } + private EvaluationResult evaluateSimpleModuleExtension( String returnStatement) throws Exception { return evaluateSimpleModuleExtension(returnStatement, /* devDependency= */ false); diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java index e013caa51e18de..c71685dec5f721 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java @@ -34,7 +34,9 @@ import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileValue.RootModuleFileValue; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionValue; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.LockfileMode; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache; import com.google.devtools.build.lib.clock.BlazeClock; @@ -182,6 +184,8 @@ private void setUpWithBuiltinModules(ImmutableMap b RepositoryDirectoryValue.FORCE_FETCH.set( differencer, RepositoryDirectoryValue.FORCE_FETCH_DISABLED); RepositoryDirectoryValue.VENDOR_DIRECTORY.set(differencer, Optional.empty()); + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.set( + differencer, RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE); PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, packageLocator.get()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, false); diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD index 8ba79b06ce9f2f..c83df42e8ccf10 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/BUILD @@ -32,6 +32,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_value", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/RepositoryDelegatorTest.java index 672e5cf5f8e9f9..749e49c7960d7a 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/RepositoryDelegatorTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/RepositoryDelegatorTest.java @@ -45,6 +45,7 @@ import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.BazelCompatibilityMode; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.CheckDirectDepsMode; import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.LockfileMode; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.RequireRepoExtensionMetadataMode; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.cmdline.RepositoryName; @@ -240,6 +241,8 @@ public void setupDelegator() throws Exception { differencer, CheckDirectDepsMode.WARNING); BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set( differencer, BazelCompatibilityMode.ERROR); + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.set( + differencer, RequireRepoExtensionMetadataMode.FALSE); BazelLockFileFunction.LOCKFILE_MODE.set(differencer, LockfileMode.UPDATE); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java index 26cdeb6a30210c..7a4f6a05b95e29 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java @@ -24,6 +24,8 @@ import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bugreport.BugReporter; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; @@ -329,8 +331,10 @@ private void initEvaluator() PrecomputedValue.injected( RepositoryDirectoryValue.FORCE_FETCH, RepositoryDirectoryValue.FORCE_FETCH_DISABLED), + PrecomputedValue.injected(RepositoryDirectoryValue.VENDOR_DIRECTORY, Optional.empty()), PrecomputedValue.injected( - RepositoryDirectoryValue.VENDOR_DIRECTORY, Optional.empty()))); + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA, + RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE))); OptionsParser parser = OptionsParser.builder().optionsClasses(BuildLanguageOptions.class).build(); parser.parse(TestConstants.PRODUCT_SPECIFIC_BUILD_LANG_OPTIONS); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD index f2729d882b8fc6..a7d07b5fe80749 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD @@ -116,6 +116,8 @@ java_library( "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories", "//src/main/java/com/google/devtools/build/lib/analysis:server_directories", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bugreport", "//src/main/java/com/google/devtools/build/lib/clock", "//src/main/java/com/google/devtools/build/lib/cmdline", @@ -1046,7 +1048,9 @@ java_test( "//src/main/java/com/google/devtools/build/lib/analysis:server_directories", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_value", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", "//src/main/java/com/google/devtools/build/lib/clock", "//src/main/java/com/google/devtools/build/lib/cmdline", @@ -1135,7 +1139,9 @@ java_test( "//src/main/java/com/google/devtools/build/lib/analysis:server_directories", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_value", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", "//src/main/java/com/google/devtools/build/lib/clock", "//src/main/java/com/google/devtools/build/lib/cmdline", @@ -1387,7 +1393,9 @@ java_test( "//src/main/java/com/google/devtools/build/lib/analysis:server_directories", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_function", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_definition_value", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repo_metadata_requirements", "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_fetch_function", + "//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", "//src/main/java/com/google/devtools/build/lib/clock", "//src/main/java/com/google/devtools/build/lib/cmdline", diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java index 14387221a89cf1..a8b26b03165320 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java @@ -25,7 +25,9 @@ import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionValue; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.cmdline.PackageIdentifier; @@ -150,6 +152,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) { RepositoryDirectoryValue.FORCE_FETCH.set( differencer, RepositoryDirectoryValue.FORCE_FETCH_DISABLED); RepositoryDirectoryValue.VENDOR_DIRECTORY.set(differencer, Optional.empty()); + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.set( + differencer, RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE); } private ContainingPackageLookupValue lookupContainingPackage(String packageName) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java index efe969cd4b1b62..b4fb0b7f3b84f8 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java @@ -41,7 +41,9 @@ import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionValue; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.cmdline.LabelConstants; @@ -214,6 +216,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) { RepositoryDirectoryValue.FORCE_FETCH.set( differencer, RepositoryDirectoryValue.FORCE_FETCH_DISABLED); RepositoryDirectoryValue.VENDOR_DIRECTORY.set(differencer, Optional.empty()); + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.set( + differencer, RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE); PrecomputedValue.STARLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT); return evaluator; } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java index 37dd0aaecfb85d..c336636d8cc6bc 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java @@ -27,7 +27,9 @@ import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionFunction; import com.google.devtools.build.lib.bazel.repository.RepoDefinitionValue; +import com.google.devtools.build.lib.bazel.repository.RepoMetadataRequirements; import com.google.devtools.build.lib.bazel.repository.RepositoryFetchFunction; +import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bazel.repository.cache.LocalRepoContentsCache; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.cmdline.PackageIdentifier; @@ -165,6 +167,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) { RepositoryDirectoryValue.FORCE_FETCH.set( differencer, RepositoryDirectoryValue.FORCE_FETCH_DISABLED); RepositoryDirectoryValue.VENDOR_DIRECTORY.set(differencer, Optional.empty()); + RepoMetadataRequirements.REQUIRE_REPO_EXTENSION_METADATA.set( + differencer, RepositoryOptions.RequireRepoExtensionMetadataMode.FALSE); } protected PackageLookupValue lookupPackage(String packageName) throws InterruptedException {