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 {