Automated rollback of commit 7d09b4a15985052670244c277e4357557b4d0039.
*** Reason for rollback ***
Now that unknown commit has been submitted, we can roll this forward with a small fix.
*** Original change description ***
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: 417820112
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 dd2b6cf..a3aa4cc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -2207,6 +2207,7 @@
"//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 3de8e89..0c276e8 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,6 +29,7 @@
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;
@@ -813,6 +814,7 @@
}
Label enclosingFileLabel = key.getLabel();
+ RepositoryName repoName = enclosingFileLabel.getRepository();
if (key instanceof BzlLoadValue.KeyForWorkspace) {
// Still during workspace file evaluation
@@ -828,30 +830,41 @@
// 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(enclosingFileLabel.getRepository(), ImmutableMap.of()));
+ workspaceFileValue.getRepositoryMapping().getOrDefault(repoName, 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
- && enclosingFileLabel.getRepository().strippedName().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;
+ 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();
+ }
}
// 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(packageIdentifier.getRepository()));
+ (RepositoryMappingValue) env.getValue(RepositoryMappingValue.key(repoName));
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 594a7a2..e2da4dd 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 = (RepositoryName) skyKey.argument();
+ RepositoryName repositoryName = ((RepositoryMappingValue.Key) skyKey).repoName();
BazelModuleResolutionValue bazelModuleResolutionValue = null;
if (Preconditions.checkNotNull(RepositoryDelegatorFunction.ENABLE_BZLMOD.get(env))) {
@@ -56,9 +56,10 @@
return null;
}
- // 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()) {
+ 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.
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 6ab436e..6d45291 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,14 +14,15 @@
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;
@@ -48,6 +49,8 @@
* 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;
@@ -63,7 +66,8 @@
/** Returns the {@link Key} for {@link RepositoryMappingValue}s. */
public static Key key(RepositoryName repositoryName) {
- return RepositoryMappingValue.Key.create(repositoryName);
+ return RepositoryMappingValue.Key.create(
+ repositoryName, /*rootModuleShouldSeeWorkspaceRepos=*/ true);
}
/** Returns a {@link RepositoryMappingValue} for a workspace with the given name. */
@@ -90,21 +94,25 @@
return repositoryMapping.toString();
}
- /** {@link com.google.devtools.build.skyframe.SkyKey} for {@link RepositoryMappingValue}. */
- @AutoCodec.VisibleForSerialization
- @AutoCodec
- static class Key extends AbstractSkyKey<RepositoryName> {
+ /** {@link SkyKey} for {@link RepositoryMappingValue}. */
+ @AutoValue
+ abstract static class Key implements SkyKey {
private static final Interner<Key> interner = BlazeInterners.newWeakInterner();
- private Key(RepositoryName arg) {
- super(arg);
- }
+ /** The name of the repo to grab mappings for. */
+ abstract RepositoryName repoName();
- @AutoCodec.VisibleForSerialization
+ /**
+ * 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.Instantiator
- static Key create(RepositoryName arg) {
- return interner.intern(new Key(arg));
+ static Key create(RepositoryName repoName, boolean rootModuleShouldSeeWorkspaceRepos) {
+ return interner.intern(
+ new AutoValue_RepositoryMappingValue_Key(repoName, rootModuleShouldSeeWorkspaceRepos));
}
@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 b6030c7..0ec34a1 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,8 +103,7 @@
@Test
public void testSimpleMapping() throws Exception {
- scratch.overwriteFile(
- "WORKSPACE",
+ rewriteWorkspace(
"workspace(name = 'good')",
"local_repository(",
" name = 'a_remote_repo',",
@@ -316,8 +315,7 @@
@Test
public void testMultipleRepositoriesWithMapping() throws Exception {
- scratch.overwriteFile(
- "WORKSPACE",
+ rewriteWorkspace(
"workspace(name = 'good')",
"local_repository(",
" name = 'a_remote_repo',",
@@ -356,8 +354,7 @@
@Test
public void testRepositoryWithMultipleMappings() throws Exception {
- scratch.overwriteFile(
- "WORKSPACE",
+ rewriteWorkspace(
"workspace(name = 'good')",
"local_repository(",
" name = 'a_remote_repo',",
@@ -381,9 +378,8 @@
}
@Test
- public void testMixtureOfBothSystems() throws Exception {
- scratch.overwriteFile(
- "WORKSPACE",
+ public void testMixtureOfBothSystems_workspaceRepo() throws Exception {
+ rewriteWorkspace(
"workspace(name = 'root')",
"local_repository(",
" name = 'ws_repo',",
@@ -434,6 +430,72 @@
}
@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(