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 04b0a36d7a4a84..767069a0a2abdb 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 @@ -48,6 +48,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.RepoSpec; import com.google.devtools.build.lib.bazel.bzlmod.SingleExtensionEvalFunction; import com.google.devtools.build.lib.bazel.bzlmod.SingleExtensionUsagesFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; import com.google.devtools.build.lib.bazel.commands.FetchCommand; import com.google.devtools.build.lib.bazel.commands.ModqueryCommand; import com.google.devtools.build.lib.bazel.commands.SyncCommand; @@ -570,7 +571,7 @@ public ImmutableList getPrecomputedValues() { BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, bazelCompatibilityMode), PrecomputedValue.injected(BazelLockFileFunction.LOCKFILE_MODE, bazelLockfileMode), PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, allowedYankedVersions)); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, allowedYankedVersions)); } @Override 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 61015909ecdbb1..1ffb2157cacacd 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 @@ -175,6 +175,7 @@ java_library( "SingleExtensionUsagesFunction.java", "StarlarkBazelModule.java", "TypeCheckedTag.java", + "YankedVersionsUtil.java", ], deps = [ ":common", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunction.java index f6d863f7e0cc8c..9040f797f1e56b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunction.java @@ -173,7 +173,7 @@ static BzlmodFlagsAndEnvVars getFlagsAndEnvVars(Environment env) throws Interrup (ClientEnvironmentValue) env.getValue( ClientEnvironmentFunction.key( - BazelModuleResolutionFunction.BZLMOD_ALLOWED_YANKED_VERSIONS_ENV)); + YankedVersionsUtil.BZLMOD_ALLOWED_YANKED_VERSIONS_ENV)); if (allowedYankedVersionsFromEnv == null) { return null; } @@ -185,7 +185,7 @@ static BzlmodFlagsAndEnvVars getFlagsAndEnvVars(Environment env) throws Interrup toImmutableMap(e -> e.getKey(), e -> ((LocalPathOverride) e.getValue()).getPath())); ImmutableList yankedVersions = - ImmutableList.copyOf(BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.get(env)); + ImmutableList.copyOf(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.get(env)); Boolean ignoreDevDeps = ModuleFileFunction.IGNORE_DEV_DEPS.get(env); String compatabilityMode = BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.get(env).name(); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java index 39092c993d6b0b..d84f09e6dd6eff 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunction.java @@ -15,27 +15,21 @@ package com.google.devtools.build.lib.bazel.bzlmod; -import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.devtools.build.lib.analysis.BlazeVersionInfo; import com.google.devtools.build.lib.bazel.BazelVersion; import com.google.devtools.build.lib.bazel.bzlmod.InterimModule.DepSpec; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileValue.RootModuleFileValue; -import com.google.devtools.build.lib.bazel.bzlmod.Version.ParseException; 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.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.server.FailureDetails.ExternalDeps.Code; -import com.google.devtools.build.lib.skyframe.ClientEnvironmentFunction; -import com.google.devtools.build.lib.skyframe.ClientEnvironmentValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; @@ -43,10 +37,8 @@ import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; -import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import javax.annotation.Nullable; /** @@ -59,22 +51,11 @@ public class BazelModuleResolutionFunction implements SkyFunction { new Precomputed<>("check_direct_dependency"); public static final Precomputed BAZEL_COMPATIBILITY_MODE = new Precomputed<>("bazel_compatibility_mode"); - public static final Precomputed> ALLOWED_YANKED_VERSIONS = - new Precomputed<>("allowed_yanked_versions"); - - public static final String BZLMOD_ALLOWED_YANKED_VERSIONS_ENV = "BZLMOD_ALLOW_YANKED_VERSIONS"; @Override @Nullable public SkyValue compute(SkyKey skyKey, Environment env) throws SkyFunctionException, InterruptedException { - - ClientEnvironmentValue allowedYankedVersionsFromEnv = - (ClientEnvironmentValue) - env.getValue(ClientEnvironmentFunction.key(BZLMOD_ALLOWED_YANKED_VERSIONS_ENV)); - if (allowedYankedVersionsFromEnv == null) { - return null; - } RootModuleFileValue root = (RootModuleFileValue) env.getValue(ModuleFileValue.KEY_FOR_ROOT_MODULE); if (root == null) { @@ -104,12 +85,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) Objects.requireNonNull(BAZEL_COMPATIBILITY_MODE.get(env)), env.getListener()); - verifyYankedVersions( - resolvedDepGraph, - parseYankedVersions( - allowedYankedVersionsFromEnv.getValue(), - Objects.requireNonNull(ALLOWED_YANKED_VERSIONS.get(env))), - env.getListener()); + checkNoYankedVersions(resolvedDepGraph); ImmutableMap finalDepGraph = computeFinalDepGraph(resolvedDepGraph, root.getOverrides(), env.getListener()); @@ -194,125 +170,10 @@ public static void checkBazelCompatibility( } } - /** - * Parse a set of allowed yanked version from command line flag (--allowed_yanked_versions) and - * environment variable (ALLOWED_YANKED_VERSIONS). If `all` is specified, return Optional.empty(); - * otherwise returns the set of parsed modulel key. - */ - private Optional> parseYankedVersions( - String allowedYankedVersionsFromEnv, List allowedYankedVersionsFromFlag) - throws BazelModuleResolutionFunctionException { - ImmutableSet.Builder allowedYankedVersionBuilder = new ImmutableSet.Builder<>(); - if (allowedYankedVersionsFromEnv != null) { - if (parseModuleKeysFromString( - allowedYankedVersionsFromEnv, - allowedYankedVersionBuilder, - String.format( - "envirnoment variable %s=%s", - BZLMOD_ALLOWED_YANKED_VERSIONS_ENV, allowedYankedVersionsFromEnv))) { - return Optional.empty(); - } - } - for (String allowedYankedVersions : allowedYankedVersionsFromFlag) { - if (parseModuleKeysFromString( - allowedYankedVersions, - allowedYankedVersionBuilder, - String.format("command line flag --allow_yanked_versions=%s", allowedYankedVersions))) { - return Optional.empty(); - } - } - return Optional.of(allowedYankedVersionBuilder.build()); - } - - /** - * Parse of a comma-separated list of module version(s) of the form '@' or - * 'all' from the string. Returns true if 'all' is present, otherwise returns false. - */ - private boolean parseModuleKeysFromString( - String input, ImmutableSet.Builder allowedYankedVersionBuilder, String context) + private static void checkNoYankedVersions(ImmutableMap depGraph) throws BazelModuleResolutionFunctionException { - ImmutableList moduleStrs = ImmutableList.copyOf(Splitter.on(',').split(input)); - - for (String moduleStr : moduleStrs) { - if (moduleStr.equals("all")) { - return true; - } - - if (moduleStr.isEmpty()) { - continue; - } - - String[] pieces = moduleStr.split("@", 2); - - if (pieces.length != 2) { - throw new BazelModuleResolutionFunctionException( - ExternalDepsException.withMessage( - Code.VERSION_RESOLUTION_ERROR, - "Parsing %s failed, module versions must be of the form '@'", - context), - Transience.PERSISTENT); - } - - if (!RepositoryName.VALID_MODULE_NAME.matcher(pieces[0]).matches()) { - throw new BazelModuleResolutionFunctionException( - ExternalDepsException.withMessage( - Code.VERSION_RESOLUTION_ERROR, - "Parsing %s failed, invalid module name '%s': valid names must 1) only contain" - + " lowercase letters (a-z), digits (0-9), dots (.), hyphens (-), and" - + " underscores (_); 2) begin with a lowercase letter; 3) end with a lowercase" - + " letter or digit.", - context, - pieces[0]), - Transience.PERSISTENT); - } - - Version version; - try { - version = Version.parse(pieces[1]); - } catch (ParseException e) { - throw new BazelModuleResolutionFunctionException( - ExternalDepsException.withCauseAndMessage( - Code.VERSION_RESOLUTION_ERROR, - e, - "Parsing %s failed, invalid version specified for module: %s", - context, - pieces[1]), - Transience.PERSISTENT); - } - - allowedYankedVersionBuilder.add(ModuleKey.create(pieces[0], version)); - } - return false; - } - - private static void verifyYankedVersions( - ImmutableMap depGraph, - Optional> allowedYankedVersions, - ExtendedEventHandler eventHandler) - throws BazelModuleResolutionFunctionException, InterruptedException { - // Check whether all resolved modules are either not yanked or allowed. Modules with a - // NonRegistryOverride are ignored as their metadata is not available whatsoever. for (InterimModule m : depGraph.values()) { - if (m.getKey().equals(ModuleKey.ROOT) || m.getRegistry() == null) { - continue; - } - Optional> yankedVersions; - try { - yankedVersions = m.getRegistry().getYankedVersions(m.getKey().getName(), eventHandler); - } catch (IOException e) { - eventHandler.handle( - Event.warn( - String.format( - "Could not read metadata file for module %s: %s", m.getKey(), e.getMessage()))); - continue; - } - if (yankedVersions.isEmpty()) { - continue; - } - String yankedInfo = yankedVersions.get().get(m.getVersion()); - if (yankedInfo != null - && allowedYankedVersions.isPresent() - && !allowedYankedVersions.get().contains(m.getKey())) { + if (m.getYankedInfo().isPresent()) { throw new BazelModuleResolutionFunctionException( ExternalDepsException.withMessage( Code.VERSION_RESOLUTION_ERROR, @@ -322,7 +183,7 @@ private static void verifyYankedVersions( + "continue using this version, allow it using the --allow_yanked_versions " + "flag or the BZLMOD_ALLOW_YANKED_VERSIONS env variable.", m.getKey(), - yankedInfo), + m.getYankedInfo().get()), Transience.PERSISTENT); } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java index 06f5051a7c0c3a..b4a6a3d8fe50c7 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java @@ -50,6 +50,9 @@ public abstract class InterimModule extends ModuleBase { /** List of bazel compatible versions that would run/fail this module */ public abstract ImmutableList getBazelCompatibility(); + /** The reason why this module was yanked or empty if it hasn't been yanked. */ + public abstract Optional getYankedInfo(); + /** The specification of a dependency. */ @AutoValue public abstract static class DepSpec { @@ -102,7 +105,8 @@ public static Builder builder() { .setName("") .setVersion(Version.EMPTY) .setKey(ModuleKey.ROOT) - .setCompatibilityLevel(0); + .setCompatibilityLevel(0) + .setYankedInfo(Optional.empty()); } /** @@ -133,6 +137,9 @@ public abstract static class Builder { /** Optional; defaults to {@link #setName}. */ public abstract Builder setRepoName(String value); + /** Optional; defaults to {@link Optional#empty()}. */ + public abstract Builder setYankedInfo(Optional value); + public abstract Builder setBazelCompatibility(ImmutableList value); abstract ImmutableList.Builder bazelCompatibilityBuilder(); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java index c436a15da12ef6..d45a255f6945ea 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java @@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileValue.NonRootModuleFileValue; @@ -28,6 +29,8 @@ import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; import com.google.devtools.build.lib.server.FailureDetails.ExternalDeps.Code; +import com.google.devtools.build.lib.skyframe.ClientEnvironmentFunction; +import com.google.devtools.build.lib.skyframe.ClientEnvironmentValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed; import com.google.devtools.build.lib.util.Fingerprint; @@ -102,10 +105,29 @@ public SkyValue compute(SkyKey skyKey, Environment env) return computeForRootModule(starlarkSemantics, env); } + ClientEnvironmentValue allowedYankedVersionsFromEnv = + (ClientEnvironmentValue) + env.getValue( + ClientEnvironmentFunction.key( + YankedVersionsUtil.BZLMOD_ALLOWED_YANKED_VERSIONS_ENV)); + if (allowedYankedVersionsFromEnv == null) { + return null; + } + + Optional> allowedYankedVersions; + try { + allowedYankedVersions = + YankedVersionsUtil.parseAllowedYankedVersions( + allowedYankedVersionsFromEnv.getValue(), + Objects.requireNonNull(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.get(env))); + } catch (ExternalDepsException e) { + throw new ModuleFileFunctionException(e, SkyFunctionException.Transience.PERSISTENT); + } + ModuleFileValue.Key moduleFileKey = (ModuleFileValue.Key) skyKey; ModuleKey moduleKey = moduleFileKey.getModuleKey(); GetModuleFileResult getModuleFileResult = - getModuleFile(moduleKey, moduleFileKey.getOverride(), env); + getModuleFile(moduleKey, moduleFileKey.getOverride(), allowedYankedVersions, env); if (getModuleFileResult == null) { return null; } @@ -119,6 +141,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) moduleKey, // Dev dependencies should always be ignored if the current module isn't the root module /* ignoreDevDeps= */ true, + // We try to prevent most side effects of yanked modules, in particular print(). + /* printIsNoop= */ getModuleFileResult.yankedInfo != null, starlarkSemantics, env); @@ -139,6 +163,23 @@ public SkyValue compute(SkyKey skyKey, Environment env) module.getVersion()); } + if (getModuleFileResult.yankedInfo != null) { + // Yanked modules should not have observable side effects such as adding dependency + // requirements, so we drop those from the constructed module. We do have to preserve the + // compatibility level as it influences the set of versions the yanked version can be updated + // to during selection. + return NonRootModuleFileValue.create( + InterimModule.builder() + .setKey(module.getKey()) + .setName(module.getName()) + .setVersion(module.getVersion()) + .setCompatibilityLevel(module.getCompatibilityLevel()) + .setRegistry(module.getRegistry()) + .setYankedInfo(Optional.of(getModuleFileResult.yankedInfo)) + .build(), + moduleFileHash); + } + return NonRootModuleFileValue.create(module, moduleFileHash); } @@ -159,6 +200,7 @@ private SkyValue computeForRootModule(StarlarkSemantics starlarkSemantics, Envir /* registry= */ null, ModuleKey.ROOT, /* ignoreDevDeps= */ Objects.requireNonNull(IGNORE_DEV_DEPS.get(env)), + /* printIsNoop= */ false, starlarkSemantics, env); InterimModule module = moduleFileGlobals.buildModule(); @@ -205,6 +247,7 @@ private ModuleFileGlobals execModuleFile( @Nullable Registry registry, ModuleKey moduleKey, boolean ignoreDevDeps, + boolean printIsNoop, StarlarkSemantics starlarkSemantics, Environment env) throws ModuleFileFunctionException, InterruptedException { @@ -223,7 +266,11 @@ private ModuleFileGlobals execModuleFile( Program program = Program.compileFile(starlarkFile, predeclaredEnv); // TODO(wyv): check that `program` has no `def`, `if`, etc StarlarkThread thread = new StarlarkThread(mu, starlarkSemantics); - thread.setPrintHandler(Event.makeDebugPrintHandler(env.getListener())); + if (printIsNoop) { + thread.setPrintHandler((t, msg) -> {}); + } else { + thread.setPrintHandler(Event.makeDebugPrintHandler(env.getListener())); + } Starlark.execFileProgram(program, predeclaredEnv, thread); } catch (SyntaxError.Exception e) { Event.replayEventsOn(env.getListener(), e.errors()); @@ -237,13 +284,19 @@ private ModuleFileGlobals execModuleFile( private static class GetModuleFileResult { ModuleFile moduleFile; + // `yankedInfo` is non-null if and only if the module has been yanked and hasn't been + // allowlisted. + @Nullable String yankedInfo; // `registry` can be null if this module has a non-registry override. @Nullable Registry registry; } @Nullable private GetModuleFileResult getModuleFile( - ModuleKey key, @Nullable ModuleOverride override, Environment env) + ModuleKey key, + @Nullable ModuleOverride override, + Optional> allowedYankedVersions, + Environment env) throws ModuleFileFunctionException, InterruptedException { // If there is a non-registry override for this module, we need to fetch the corresponding repo // first and read the module file from there. @@ -303,6 +356,10 @@ private GetModuleFileResult getModuleFile( } result.moduleFile = moduleFile.get(); result.registry = registry; + result.yankedInfo = + YankedVersionsUtil.getYankedInfo( + registry, key, allowedYankedVersions, env.getListener()) + .orElse(null); return result; } catch (IOException e) { throw errorf( @@ -346,5 +403,9 @@ static final class ModuleFileFunctionException extends SkyFunctionException { ModuleFileFunctionException(Exception cause) { super(cause, Transience.TRANSIENT); } + + ModuleFileFunctionException(ExternalDepsException cause, Transience transience) { + super(cause, transience); + } } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/YankedVersionsUtil.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/YankedVersionsUtil.java new file mode 100644 index 00000000000000..b6b5018b151286 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/YankedVersionsUtil.java @@ -0,0 +1,157 @@ +// Copyright 2022 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.bazel.bzlmod; + +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.server.FailureDetails; +import com.google.devtools.build.lib.skyframe.PrecomputedValue; +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +/** Utility class to parse and evaluate yanked version specifications and exceptions. */ +public final class YankedVersionsUtil { + + public static final PrecomputedValue.Precomputed> ALLOWED_YANKED_VERSIONS = + new PrecomputedValue.Precomputed<>("allowed_yanked_versions"); + public static final String BZLMOD_ALLOWED_YANKED_VERSIONS_ENV = "BZLMOD_ALLOW_YANKED_VERSIONS"; + + /** + * Parse a set of allowed yanked version from command line flag (--allowed_yanked_versions) and + * environment variable (ALLOWED_YANKED_VERSIONS). If `all` is specified, return Optional.empty(); + * otherwise returns the set of parsed modulel key. + */ + static Optional> parseAllowedYankedVersions( + String allowedYankedVersionsFromEnv, List allowedYankedVersionsFromFlag) + throws ExternalDepsException { + ImmutableSet.Builder allowedYankedVersionBuilder = new ImmutableSet.Builder<>(); + if (allowedYankedVersionsFromEnv != null) { + if (parseModuleKeysFromString( + allowedYankedVersionsFromEnv, + allowedYankedVersionBuilder, + String.format( + "environment variable %s=%s", + BZLMOD_ALLOWED_YANKED_VERSIONS_ENV, allowedYankedVersionsFromEnv))) { + return Optional.empty(); + } + } + for (String allowedYankedVersions : allowedYankedVersionsFromFlag) { + if (parseModuleKeysFromString( + allowedYankedVersions, + allowedYankedVersionBuilder, + String.format("command line flag --allow_yanked_versions=%s", allowedYankedVersions))) { + return Optional.empty(); + } + } + return Optional.of(allowedYankedVersionBuilder.build()); + } + + /** + * Returns the reason for the given module being yanked, or {@code Optional.empty()} if the module + * is not yanked or explicitly allowed despite being yanked. + */ + static Optional getYankedInfo( + Registry registry, + ModuleKey key, + Optional> allowedYankedVersions, + ExtendedEventHandler eventHandler) + throws InterruptedException { + Optional> yankedVersions; + try { + yankedVersions = registry.getYankedVersions(key.getName(), eventHandler); + } catch (IOException e) { + eventHandler.handle( + Event.warn( + String.format( + "Could not read metadata file for module %s: %s", key, e.getMessage()))); + // This is failing open: If we can't read the metadata file, we allow yanked modules to be + // fetched. + return Optional.empty(); + } + if (yankedVersions.isEmpty()) { + return Optional.empty(); + } + String yankedInfo = yankedVersions.get().get(key.getVersion()); + if (yankedInfo != null + && allowedYankedVersions.isPresent() + && !allowedYankedVersions.get().contains(key)) { + return Optional.of(yankedInfo); + } else { + return Optional.empty(); + } + } + + /** + * Parse of a comma-separated list of module version(s) of the form '@' or + * 'all' from the string. Returns true if 'all' is present, otherwise returns false. + */ + private static boolean parseModuleKeysFromString( + String input, ImmutableSet.Builder allowedYankedVersionBuilder, String context) + throws ExternalDepsException { + ImmutableList moduleStrs = ImmutableList.copyOf(Splitter.on(',').split(input)); + + for (String moduleStr : moduleStrs) { + if (moduleStr.equals("all")) { + return true; + } + + if (moduleStr.isEmpty()) { + continue; + } + + String[] pieces = moduleStr.split("@", 2); + + if (pieces.length != 2) { + throw ExternalDepsException.withMessage( + FailureDetails.ExternalDeps.Code.VERSION_RESOLUTION_ERROR, + "Parsing %s failed, module versions must be of the form '@'", + context); + } + + if (!RepositoryName.VALID_MODULE_NAME.matcher(pieces[0]).matches()) { + throw ExternalDepsException.withMessage( + FailureDetails.ExternalDeps.Code.VERSION_RESOLUTION_ERROR, + "Parsing %s failed, invalid module name '%s': valid names must 1) only contain" + + " lowercase letters (a-z), digits (0-9), dots (.), hyphens (-), and" + + " underscores (_); 2) begin with a lowercase letter; 3) end with a lowercase" + + " letter or digit.", + context, + pieces[0]); + } + + Version version; + try { + version = Version.parse(pieces[1]); + } catch (Version.ParseException e) { + throw ExternalDepsException.withCauseAndMessage( + FailureDetails.ExternalDeps.Code.VERSION_RESOLUTION_ERROR, + e, + "Parsing %s failed, invalid version specified for module: %s", + context, + pieces[1]); + } + + allowedYankedVersionBuilder.add(ModuleKey.create(pieces[0], version)); + } + return false; + } + + private YankedVersionsUtil() {} +} diff --git a/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java b/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java index aa5894aa028452..48bdf7f6594b3a 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -57,7 +58,7 @@ protected ImmutableList extraPrecomputedValues() throws Exception { PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, BazelCompatibilityMode.ERROR), PrecomputedValue.injected(BazelLockFileFunction.LOCKFILE_MODE, LockfileMode.UPDATE), - PrecomputedValue.injected(BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of())); + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of())); } @Before diff --git a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java index 4876868cb7520d..b82925ec0ea36d 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/StarlarkRuleTransitionProviderTest.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -71,8 +72,7 @@ protected ImmutableList extraPrecomputedValues() { ModuleFileFunction.REGISTRIES, ImmutableList.of(registry.getUrl())), PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false), PrecomputedValue.injected(ModuleFileFunction.MODULE_OVERRIDES, ImmutableMap.of()), - PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java index 51b0eef293b7c2..dbe786ae3b5bea 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java @@ -53,6 +53,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -240,7 +241,7 @@ protected void useRuleClassProvider(ConfiguredRuleClassProvider ruleClassProvide BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, BazelCompatibilityMode.ERROR), @@ -290,7 +291,7 @@ private void reinitializeSkyframeExecutor() { BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, BazelCompatibilityMode.WARNING), diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunctionTest.java index 5dda67fd839ba2..d4c4f32b46225f 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelDepGraphFunctionTest.java @@ -147,7 +147,7 @@ public void setup() throws Exception { BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set( differencer, BazelCompatibilityMode.ERROR); BazelLockFileFunction.LOCKFILE_MODE.set(differencer, LockfileMode.UPDATE); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileFunctionTest.java index 9461583a3d57f1..8956b9795dd4a5 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelLockFileFunctionTest.java @@ -203,7 +203,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, true); ModuleFileFunction.MODULE_OVERRIDES.set(differencer, ImmutableMap.of()); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set( differencer, BazelCompatibilityMode.ERROR); BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES.set( @@ -283,7 +283,7 @@ public void moduleWithFlags() throws Exception { ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, true); ModuleFileFunction.REGISTRIES.set(differencer, registries); ModuleFileFunction.MODULE_OVERRIDES.set(differencer, ImmutableMap.of("my_dep_1", override)); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, yankedVersions); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, yankedVersions); BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES.set( differencer, CheckDirectDepsMode.WARNING); BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set( diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java index 1a05544e9d2fd0..088943ef9a47e9 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionFunctionTest.java @@ -131,7 +131,7 @@ public void setup() throws Exception { BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set( differencer, BazelCompatibilityMode.ERROR); BazelLockFileFunction.LOCKFILE_MODE.set(differencer, LockfileMode.UPDATE); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); } @Test @@ -282,7 +282,7 @@ public void testYankedVersionCheckSuccess() throws Exception { @Test public void testYankedVersionCheckIgnoredByAll() throws Exception { setupModulesForYankedVersion(); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of("all")); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of("all")); EvaluationResult result = evaluator.evaluate(ImmutableList.of(BazelModuleResolutionValue.KEY), evaluationContext); assertThat(result.hasError()).isFalse(); @@ -291,8 +291,7 @@ public void testYankedVersionCheckIgnoredByAll() throws Exception { @Test public void testYankedVersionCheckIgnoredBySpecific() throws Exception { setupModulesForYankedVersion(); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set( - differencer, ImmutableList.of("b@1.0")); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of("b@1.0")); EvaluationResult result = evaluator.evaluate(ImmutableList.of(BazelModuleResolutionValue.KEY), evaluationContext); assertThat(result.hasError()).isFalse(); @@ -301,8 +300,7 @@ public void testYankedVersionCheckIgnoredBySpecific() throws Exception { @Test public void testBadYankedVersionFormat() throws Exception { setupModulesForYankedVersion(); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set( - differencer, ImmutableList.of("b~1.0")); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of("b~1.0")); EvaluationResult result = evaluator.evaluate(ImmutableList.of(BazelModuleResolutionValue.KEY), evaluationContext); assertThat(result.hasError()).isTrue(); @@ -329,4 +327,86 @@ private void setupModulesForYankedVersion() throws Exception { .addYankedVersion("b", ImmutableMap.of(Version.parse("1.0"), "1.0 is a bad version!")); ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of(registry.getUrl())); } + + @Test + public void testYankedVersionSideEffects_equalCompatibilityLevel() throws Exception { + scratch.file( + rootDirectory.getRelative("MODULE.bazel").getPathString(), + "module(name='mod', version='1.0')", + "bazel_dep(name = 'a', version = '1.0')", + "bazel_dep(name = 'b', version = '1.1')"); + + FakeRegistry registry = + registryFactory + .newFakeRegistry("/bar") + .addModule( + createModuleKey("a", "1.0"), + "module(name='a', version='1.0')", + "bazel_dep(name='b', version='1.0')") + .addModule(createModuleKey("c", "1.0"), "module(name='c', version='1.0')") + .addModule(createModuleKey("c", "1.1"), "module(name='c', version='1.1')") + .addModule( + createModuleKey("b", "1.0"), + "module(name='b', version='1.0', compatibility_level = 2)", + "bazel_dep(name='c', version='1.1')", + "print('hello from yanked version')") + .addModule( + createModuleKey("b", "1.1"), + "module(name='b', version='1.1', compatibility_level = 2)", + "bazel_dep(name='c', version='1.0')") + .addYankedVersion("b", ImmutableMap.of(Version.parse("1.0"), "1.0 is a bad version!")); + + ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of(registry.getUrl())); + EvaluationResult result = + evaluator.evaluate(ImmutableList.of(BazelModuleResolutionValue.KEY), evaluationContext); + + assertThat(result.hasError()).isFalse(); + assertThat(result.get(BazelModuleResolutionValue.KEY).getResolvedDepGraph().keySet()) + .containsExactly( + ModuleKey.ROOT, + createModuleKey("a", "1.0"), + createModuleKey("b", "1.1"), + createModuleKey("c", "1.0")); + assertDoesNotContainEvent("hello from yanked version"); + } + + @Test + public void testYankedVersionSideEffects_differentCompatibilityLevel() throws Exception { + scratch.file( + rootDirectory.getRelative("MODULE.bazel").getPathString(), + "module(name='mod', version='1.0')", + "bazel_dep(name = 'a', version = '1.0')", + "bazel_dep(name = 'b', version = '1.1')"); + + FakeRegistry registry = + registryFactory + .newFakeRegistry("/bar") + .addModule( + createModuleKey("a", "1.0"), + "module(name='a', version='1.0')", + "bazel_dep(name='b', version='1.0')") + .addModule(createModuleKey("c", "1.0"), "module(name='c', version='1.0')") + .addModule(createModuleKey("c", "1.1"), "module(name='c', version='1.1')") + .addModule( + createModuleKey("b", "1.0"), + "module(name='b', version='1.0', compatibility_level = 2)", + "bazel_dep(name='c', version='1.1')", + "print('hello from yanked version')") + .addModule( + createModuleKey("b", "1.1"), + "module(name='b', version='1.1', compatibility_level = 3)", + "bazel_dep(name='c', version='1.0')") + .addYankedVersion("b", ImmutableMap.of(Version.parse("1.0"), "1.0 is a bad version!")); + + ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of(registry.getUrl())); + EvaluationResult result = + evaluator.evaluate(ImmutableList.of(BazelModuleResolutionValue.KEY), evaluationContext); + + assertThat(result.hasError()).isTrue(); + assertThat(result.getError().toString()) + .contains( + "a@1.0 depends on b@1.0 with compatibility level 2, but depends on b@1.1 with" + + " compatibility level 3 which is different"); + assertDoesNotContainEvent("hello from yanked version"); + } } diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java index 92ff555778779d..46b9ae30be2aa2 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java @@ -140,7 +140,7 @@ public void setup() throws Exception { ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, false); ModuleFileFunction.MODULE_OVERRIDES.set(differencer, ImmutableMap.of()); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES.set( differencer, CheckDirectDepsMode.WARNING); BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set( 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 3dd0810fda3fa6..37ed209fa7e41b 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 @@ -41,6 +41,7 @@ import com.google.devtools.build.lib.rules.repository.RepositoryFunction; import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants; import com.google.devtools.build.lib.skyframe.BzlmodRepoRuleFunction; +import com.google.devtools.build.lib.skyframe.ClientEnvironmentFunction; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction; import com.google.devtools.build.lib.skyframe.FileFunction; @@ -178,6 +179,9 @@ private void setUpWithBuiltinModules(ImmutableMap b .put( BzlmodRepoRuleValue.BZLMOD_REPO_RULE, new BzlmodRepoRuleFunction(ruleClassProvider, directories)) + .put( + SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, + new ClientEnvironmentFunction(new AtomicReference<>(ImmutableMap.of()))) .buildOrThrow(), differencer); @@ -196,7 +200,7 @@ private void setUpWithBuiltinModules(ImmutableMap b RepositoryDelegatorFunction.RESOLVED_FILE_FOR_VERIFICATION.set(differencer, Optional.empty()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, false); ModuleFileFunction.MODULE_OVERRIDES.set(differencer, ImmutableMap.of()); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); } @Test 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 d73b2d479795ae..10f86b92dbbc12 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 @@ -276,7 +276,7 @@ public void setup() throws Exception { RepositoryDelegatorFunction.RESOLVED_FILE_FOR_VERIFICATION.set(differencer, Optional.empty()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, false); ModuleFileFunction.MODULE_OVERRIDES.set(differencer, ImmutableMap.of()); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of(registry.getUrl())); BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES.set( differencer, CheckDirectDepsMode.WARNING); 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 1c251bf970258f..52dddf54eea8dc 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 @@ -43,6 +43,7 @@ import com.google.devtools.build.lib.rules.repository.RepositoryFunction; import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants; import com.google.devtools.build.lib.skyframe.BzlmodRepoRuleFunction; +import com.google.devtools.build.lib.skyframe.ClientEnvironmentFunction; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction; import com.google.devtools.build.lib.skyframe.FileFunction; @@ -152,6 +153,9 @@ private void setUpWithBuiltinModules(ImmutableMap b .put( BzlmodRepoRuleValue.BZLMOD_REPO_RULE, new BzlmodRepoRuleFunction(ruleClassProvider, directories)) + .put( + SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, + new ClientEnvironmentFunction(new AtomicReference<>(ImmutableMap.of()))) .buildOrThrow(), differencer); @@ -170,7 +174,7 @@ private void setUpWithBuiltinModules(ImmutableMap b RepositoryDelegatorFunction.RESOLVED_FILE_FOR_VERIFICATION.set(differencer, Optional.empty()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, false); ModuleFileFunction.MODULE_OVERRIDES.set(differencer, ImmutableMap.of()); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java b/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java index 3ce62e94f51e74..5159f9f7b05e2f 100644 --- a/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java +++ b/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; import com.google.devtools.build.lib.bazel.bzlmod.ModuleKey; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -367,7 +368,7 @@ protected SkyframeExecutor createSkyframeExecutor(ConfiguredRuleClassProvider ru BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, BazelCompatibilityMode.ERROR), @@ -410,7 +411,7 @@ protected SkyframeExecutor createSkyframeExecutor(ConfiguredRuleClassProvider ru CheckDirectDepsMode.WARNING)) .add( PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of())) + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of())) .add( PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, diff --git a/src/test/java/com/google/devtools/build/lib/rules/LabelBuildSettingTest.java b/src/test/java/com/google/devtools/build/lib/rules/LabelBuildSettingTest.java index 7ce085431e5bb5..24fcfd5962afa1 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/LabelBuildSettingTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/LabelBuildSettingTest.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -54,8 +55,7 @@ protected ImmutableList extraPrecomputedValues() { ModuleFileFunction.REGISTRIES, ImmutableList.of(registry.getUrl())), PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false), PrecomputedValue.injected(ModuleFileFunction.MODULE_OVERRIDES, ImmutableMap.of()), - PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java index 6ca0e6fff59be6..d75121b3964689 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BzlmodRepoRuleValue; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -266,7 +267,7 @@ public void setupDelegator() throws Exception { RepositoryDelegatorFunction.RESOLVED_FILE_FOR_VERIFICATION.set(differencer, Optional.empty()); ModuleFileFunction.IGNORE_DEV_DEPS.set(differencer, false); ModuleFileFunction.MODULE_OVERRIDES.set(differencer, ImmutableMap.of()); - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); + YankedVersionsUtil.ALLOWED_YANKED_VERSIONS.set(differencer, ImmutableList.of()); BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES.set( differencer, CheckDirectDepsMode.WARNING); BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE.set( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java index 2b98361118813b..5e3b32cc16ba2d 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -107,8 +108,7 @@ protected ImmutableList extraPrecomputedValues() { ModuleFileFunction.REGISTRIES, ImmutableList.of(registry.getUrl())), PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false), PrecomputedValue.injected(ModuleFileFunction.MODULE_OVERRIDES, ImmutableMap.of()), - PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java index aaf6bd05afee16..4659b937a969f9 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionTest.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; import com.google.devtools.build.lib.bazel.bzlmod.ModuleKey; import com.google.devtools.build.lib.bazel.bzlmod.Version; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -243,8 +244,7 @@ protected ImmutableList extraPrecomputedValues() { PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false), PrecomputedValue.injected( BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), - PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.BAZEL_COMPATIBILITY_MODE, BazelCompatibilityMode.ERROR), PrecomputedValue.injected(BazelLockFileFunction.LOCKFILE_MODE, LockfileMode.UPDATE)); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java index 5097e5e24982c2..fdd77131a9b1d4 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunctionTest.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -107,8 +108,7 @@ protected ImmutableList extraPrecomputedValues() { ModuleFileFunction.REGISTRIES, ImmutableList.of(registry.getUrl())), PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false), PrecomputedValue.injected(ModuleFileFunction.MODULE_OVERRIDES, ImmutableMap.of()), - PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java index b7b54d9e88bd5c..cbc9a59769375a 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction; import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -63,8 +64,7 @@ protected ImmutableList extraPrecomputedValues() { ModuleFileFunction.REGISTRIES, ImmutableList.of(registry.getUrl())), PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false), PrecomputedValue.injected(ModuleFileFunction.MODULE_OVERRIDES, ImmutableMap.of()), - PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java index b7dcd438e337e1..17aa0b5ed80864 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; import com.google.devtools.build.lib.bazel.bzlmod.Version; +import com.google.devtools.build.lib.bazel.bzlmod.YankedVersionsUtil; 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; @@ -82,8 +83,7 @@ protected ImmutableList extraPrecomputedValues() thro ModuleFileFunction.REGISTRIES, ImmutableList.of(registry.getUrl())), PrecomputedValue.injected(ModuleFileFunction.IGNORE_DEV_DEPS, false), PrecomputedValue.injected(ModuleFileFunction.MODULE_OVERRIDES, ImmutableMap.of()), - PrecomputedValue.injected( - BazelModuleResolutionFunction.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), + PrecomputedValue.injected(YankedVersionsUtil.ALLOWED_YANKED_VERSIONS, ImmutableList.of()), PrecomputedValue.injected( BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING), PrecomputedValue.injected(