Automated rollback of commit 13112c027c0064cf0a29256e80560cb6630af94d.
*** Reason for rollback ***
Causes [failures](https://buildkite.com/bazel/google-bazel-presubmit/builds/52620) in Presubmit of unknown commit, itself a Rollback of https://github.com/bazelbuild/bazel/commit/78d01316b22667e9d1758472c91dfee35cc189bd
*** Original change description ***
Bzlmod: When evaluating extensions in the main repo, do not load WORKSPACE
(https://github.com/bazelbuild/bazel/issues/13316)
See new comment in BzlLoadFunction.java for details. https://github.com/bazelbuild/bazel-central-registry/pull/47#issuecomment-998883652 also has a bit more context.
PiperOrigin-RevId: 417668153
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index a3aa4cc..dd2b6cf 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -2207,7 +2207,6 @@
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
- "//third_party:auto_value",
"//third_party:guava",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
index 0c276e8..3537eff 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
@@ -29,7 +29,6 @@
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
@@ -814,7 +813,6 @@
}
Label enclosingFileLabel = key.getLabel();
- RepositoryName repoName = enclosingFileLabel.getRepository();
if (key instanceof BzlLoadValue.KeyForWorkspace) {
// Still during workspace file evaluation
@@ -830,41 +828,30 @@
// Note: we know for sure that the requested WorkspaceFileValue is fully computed so we do
// not need to check if it is null
return RepositoryMapping.createAllowingFallback(
- workspaceFileValue.getRepositoryMapping().getOrDefault(repoName, ImmutableMap.of()));
+ workspaceFileValue
+ .getRepositoryMapping()
+ .getOrDefault(enclosingFileLabel.getRepository(), ImmutableMap.of()));
// NOTE(wyv): this means that, in the WORKSPACE file, we can't load from a repo generated by
// bzlmod. If that's a problem, we should "fall back" to the bzlmod case below.
}
}
- if (key instanceof BzlLoadValue.KeyForBzlmod) {
- if (repoName.equals(RepositoryName.BAZEL_TOOLS)) {
- // Special case: we're only here to get the @bazel_tools repo (for example, for
- // http_archive). This repo shouldn't have visibility into anything else (during repo
- // generation), so we just return an empty repo mapping.
- // TODO(wyv): disallow fallback.
- return RepositoryMapping.ALWAYS_FALLBACK;
- }
- if (repoName.isMain()) {
- // Special case: when we try to run an extension in the main repo, we need to grab the repo
- // mapping for the main repo, which normally would include all WORKSPACE repos. This is
- // problematic if the reason we're running an extension at all is that we're trying to do a
- // `load` in WORKSPACE. So we specifically say that, to run an extension in the main repo,
- // we ask for a repo mapping *without* WORKSPACE repos.
- RepositoryMappingValue repositoryMappingValue =
- (RepositoryMappingValue)
- env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS);
- if (repositoryMappingValue == null) {
- return null;
- }
- return repositoryMappingValue.getRepositoryMapping();
- }
+ if (key instanceof BzlLoadValue.KeyForBzlmod
+ && enclosingFileLabel.getRepository().getName().equals("bazel_tools")) {
+ // Special case: we're only here to get the @bazel_tools repo (for example, for http_archive).
+ // This repo shouldn't have visibility into anything else (during repo generation), so we just
+ // return an empty repo mapping.
+ // TODO(wyv): disallow fallback.
+ return RepositoryMapping.ALWAYS_FALLBACK;
}
// This is either a .bzl loaded from BUILD files, or a .bzl loaded for bzlmod (in which case the
// .bzl file *has* to be from a Bazel module anyway). So we can just use the full repo mapping
// from RepositoryMappingFunction.
+ PackageIdentifier packageIdentifier = enclosingFileLabel.getPackageIdentifier();
RepositoryMappingValue repositoryMappingValue =
- (RepositoryMappingValue) env.getValue(RepositoryMappingValue.key(repoName));
+ (RepositoryMappingValue)
+ env.getValue(RepositoryMappingValue.key(packageIdentifier.getRepository()));
if (repositoryMappingValue == null) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java
index 57a19d5..81dc320 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java
@@ -46,7 +46,7 @@
@Override
public SkyValue compute(SkyKey skyKey, Environment env)
throws SkyFunctionException, InterruptedException {
- RepositoryName repositoryName = ((RepositoryMappingValue.Key) skyKey).repoName();
+ RepositoryName repositoryName = (RepositoryName) skyKey.argument();
BazelModuleResolutionValue bazelModuleResolutionValue = null;
if (Preconditions.checkNotNull(RepositoryDelegatorFunction.ENABLE_BZLMOD.get(env))) {
@@ -56,10 +56,9 @@
return null;
}
- if (repositoryName.isMain()
- && ((RepositoryMappingValue.Key) skyKey).rootModuleShouldSeeWorkspaceRepos()) {
- // The root module should be able to see repos defined in WORKSPACE. Therefore, we find all
- // workspace repos and add them as extra visible repos in root module's repo mappings.
+ // The root module should be able to see repos defined in WORKSPACE. Therefore, we find all
+ // workspace repos and add them as extra visible repos in root module's repo mappings.
+ if (repositoryName.isMain()) {
SkyKey externalPackageKey = PackageValue.key(LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER);
PackageValue externalPackageValue = (PackageValue) env.getValue(externalPackageKey);
if (env.valuesMissing()) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java
index 6d45291..6ab436e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java
@@ -14,15 +14,14 @@
package com.google.devtools.build.lib.skyframe;
-import com.google.auto.value.AutoValue;
import com.google.common.base.Preconditions;
import com.google.common.collect.Interner;
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.skyframe.AbstractSkyKey;
import com.google.devtools.build.skyframe.SkyFunctionName;
-import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
import java.util.Objects;
@@ -49,8 +48,6 @@
* packages. If the mappings are changed then the external packages need to be reloaded.
*/
public class RepositoryMappingValue implements SkyValue {
- public static final Key KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS =
- Key.create(RepositoryName.MAIN, /*rootModuleShouldSeeWorkspaceRepos=*/ false);
private final RepositoryMapping repositoryMapping;
@@ -66,8 +63,7 @@
/** Returns the {@link Key} for {@link RepositoryMappingValue}s. */
public static Key key(RepositoryName repositoryName) {
- return RepositoryMappingValue.Key.create(
- repositoryName, /*rootModuleShouldSeeWorkspaceRepos=*/ true);
+ return RepositoryMappingValue.Key.create(repositoryName);
}
/** Returns a {@link RepositoryMappingValue} for a workspace with the given name. */
@@ -94,25 +90,21 @@
return repositoryMapping.toString();
}
- /** {@link SkyKey} for {@link RepositoryMappingValue}. */
- @AutoValue
- abstract static class Key implements SkyKey {
+ /** {@link com.google.devtools.build.skyframe.SkyKey} for {@link RepositoryMappingValue}. */
+ @AutoCodec.VisibleForSerialization
+ @AutoCodec
+ static class Key extends AbstractSkyKey<RepositoryName> {
private static final Interner<Key> interner = BlazeInterners.newWeakInterner();
- /** The name of the repo to grab mappings for. */
- abstract RepositoryName repoName();
+ private Key(RepositoryName arg) {
+ super(arg);
+ }
- /**
- * Whether the root module should see repos defined in WORKSPACE. This only takes effect when
- * {@link #repoName} is the main repo.
- */
- abstract boolean rootModuleShouldSeeWorkspaceRepos();
-
+ @AutoCodec.VisibleForSerialization
@AutoCodec.Instantiator
- static Key create(RepositoryName repoName, boolean rootModuleShouldSeeWorkspaceRepos) {
- return interner.intern(
- new AutoValue_RepositoryMappingValue_Key(repoName, rootModuleShouldSeeWorkspaceRepos));
+ static Key create(RepositoryName arg) {
+ return interner.intern(new Key(arg));
}
@Override
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 49a04f5..5c426d2 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
@@ -103,7 +103,8 @@
@Test
public void testSimpleMapping() throws Exception {
- rewriteWorkspace(
+ scratch.overwriteFile(
+ "WORKSPACE",
"workspace(name = 'good')",
"local_repository(",
" name = 'a_remote_repo',",
@@ -315,7 +316,8 @@
@Test
public void testMultipleRepositoriesWithMapping() throws Exception {
- rewriteWorkspace(
+ scratch.overwriteFile(
+ "WORKSPACE",
"workspace(name = 'good')",
"local_repository(",
" name = 'a_remote_repo',",
@@ -354,7 +356,8 @@
@Test
public void testRepositoryWithMultipleMappings() throws Exception {
- rewriteWorkspace(
+ scratch.overwriteFile(
+ "WORKSPACE",
"workspace(name = 'good')",
"local_repository(",
" name = 'a_remote_repo',",
@@ -378,8 +381,9 @@
}
@Test
- public void testMixtureOfBothSystems_workspaceRepo() throws Exception {
- rewriteWorkspace(
+ public void testMixtureOfBothSystems() throws Exception {
+ scratch.overwriteFile(
+ "WORKSPACE",
"workspace(name = 'root')",
"local_repository(",
" name = 'ws_repo',",
@@ -430,72 +434,6 @@
}
@Test
- public void testMixtureOfBothSystems_mainRepo() throws Exception {
- rewriteWorkspace(
- "workspace(name = 'root')",
- "local_repository(",
- " name = 'ws_repo',",
- " path = '/ws_repo',",
- ")");
- scratch.overwriteFile(
- "MODULE.bazel", "module(name='A',version='0.1')", "bazel_dep(name='B',version='1.0')");
- registry
- .addModule(
- createModuleKey("B", "1.0"),
- "module(name='B', version='1.0');bazel_dep(name='C', version='2.0')")
- .addModule(createModuleKey("C", "2.0"), "module(name='C', version='2.0')");
-
- SkyKey skyKey = RepositoryMappingValue.key(RepositoryName.MAIN);
- assertThatEvaluationResult(eval(skyKey))
- .hasEntryThat(skyKey)
- .isEqualTo(
- withMappingForRootModule(
- ImmutableMap.of(
- RepositoryName.MAIN,
- RepositoryName.MAIN,
- RepositoryName.create("A"),
- RepositoryName.MAIN,
- RepositoryName.create("B"),
- RepositoryName.create("B.1.0"),
- RepositoryName.create("root"),
- RepositoryName.create("root"),
- RepositoryName.create("ws_repo"),
- RepositoryName.create("ws_repo")),
- RepositoryName.MAIN));
- }
-
- @Test
- public void testMixtureOfBothSystems_mainRepo_shouldNotSeeWorkspaceRepos() throws Exception {
- rewriteWorkspace(
- "workspace(name = 'root')",
- "local_repository(",
- " name = 'ws_repo',",
- " path = '/ws_repo',",
- ")");
- scratch.overwriteFile(
- "MODULE.bazel", "module(name='A',version='0.1')", "bazel_dep(name='B',version='1.0')");
- registry
- .addModule(
- createModuleKey("B", "1.0"),
- "module(name='B', version='1.0');bazel_dep(name='C', version='2.0')")
- .addModule(createModuleKey("C", "2.0"), "module(name='C', version='2.0')");
-
- SkyKey skyKey = RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS;
- assertThatEvaluationResult(eval(skyKey))
- .hasEntryThat(skyKey)
- .isEqualTo(
- withMapping(
- ImmutableMap.of(
- RepositoryName.MAIN,
- RepositoryName.MAIN,
- RepositoryName.create("A"),
- RepositoryName.MAIN,
- RepositoryName.create("B"),
- RepositoryName.create("B.1.0")),
- RepositoryName.MAIN));
- }
-
- @Test
public void testErrorWithMapping() throws Exception {
reporter.removeHandler(failFastHandler);
scratch.overwriteFile(