bzlmod: Load repositories from Bzlmod
With --experimental_enable_bzlmod=true, Bazel can now load external repositories
from the new dependency management system -- Bzlmod.
Related: https://github.com/bazelbuild/bazel/issues/13316
RELNOTES: None
PiperOrigin-RevId: 384424361
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 d564f02..4db4fb0 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
@@ -237,6 +237,7 @@
PrecomputedValue.injected(
RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING,
RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY),
+ PrecomputedValue.injected(RepositoryDelegatorFunction.ENABLE_BZLMOD, false),
PrecomputedValue.injected(
BuildInfoCollectionFunction.BUILD_INFO_FACTORIES,
ruleClassProvider.getBuildInfoFactoriesAsMap())));
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index b5bc08e..7b6f598 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -298,6 +298,7 @@
PrecomputedValue.injected(
RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING,
RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY),
+ PrecomputedValue.injected(RepositoryDelegatorFunction.ENABLE_BZLMOD, false),
PrecomputedValue.injected(
BuildInfoCollectionFunction.BUILD_INFO_FACTORIES,
ruleClassProvider.getBuildInfoFactoriesAsMap()));
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index b61b64a..c2d3b9b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -161,6 +161,7 @@
PrecomputedValue.injected(
RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING,
RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY),
+ PrecomputedValue.injected(RepositoryDelegatorFunction.ENABLE_BZLMOD, false),
PrecomputedValue.injected(
BuildInfoCollectionFunction.BUILD_INFO_FACTORIES,
ruleClassProvider.getBuildInfoFactoriesAsMap())));
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 fd8d250..6128991 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
@@ -16,8 +16,15 @@
java_library(
name = "BzlmodTests_lib",
- srcs = glob(["*.java"]),
+ srcs = glob(
+ ["*.java"],
+ exclude = [
+ "FakeRegistry.java",
+ "BzlmodTestUtil.java",
+ ],
+ ),
deps = [
+ ":util",
"//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
"//src/main/java/com/google/devtools/build/lib/actions:thread_state_receiver",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -30,7 +37,6 @@
"//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution",
"//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
"//src/main/java/com/google/devtools/build/lib/bazel/repository/starlark",
- "//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/packages",
"//src/main/java/com/google/devtools/build/lib/pkgcache",
"//src/main/java/com/google/devtools/build/lib/skyframe:bzl_compile",
@@ -68,3 +74,17 @@
"//src/test/java/com/google/devtools/build/lib:test_runner",
],
)
+
+java_library(
+ name = "util",
+ srcs = [
+ "BzlmodTestUtil.java",
+ "FakeRegistry.java",
+ ],
+ deps = [
+ "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:common",
+ "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:registry",
+ "//src/main/java/com/google/devtools/build/lib/events",
+ "//third_party:guava",
+ ],
+)
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 c272deb..4bd53a2 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
@@ -335,7 +335,8 @@
RepositoryDelegatorFunction.REPOSITORY_OVERRIDES, ImmutableMap.of()),
PrecomputedValue.injected(
RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING,
- RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY)));
+ RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY),
+ PrecomputedValue.injected(RepositoryDelegatorFunction.ENABLE_BZLMOD, false)));
SkyframeExecutorTestHelper.process(skyframeExecutor);
return skyframeExecutor;
}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
index 1b2f535..0fe74eb 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/BUILD
@@ -21,6 +21,9 @@
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//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/bzlmod:repo_rule_helper",
+ "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:repo_rule_value",
+ "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution",
"//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader",
"//src/main/java/com/google/devtools/build/lib/bazel/repository/starlark",
"//src/main/java/com/google/devtools/build/lib/cmdline",
@@ -48,6 +51,7 @@
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/main/java/net/starlark/java/eval",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
+ "//src/test/java/com/google/devtools/build/lib/bazel/bzlmod:util",
"//src/test/java/com/google/devtools/build/lib/testutil",
"//src/test/java/com/google/devtools/build/lib/testutil:TestConstants",
"//third_party:caffeine",
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 16cb821..e3b2030 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
@@ -17,6 +17,7 @@
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.devtools.build.lib.bazel.bzlmod.BzlmodTestUtil.createModuleKey;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.google.common.collect.ImmutableList;
@@ -30,6 +31,12 @@
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ServerDirectories;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
+import com.google.devtools.build.lib.bazel.bzlmod.BzlmodRepoRuleHelperImpl;
+import com.google.devtools.build.lib.bazel.bzlmod.BzlmodRepoRuleValue;
+import com.google.devtools.build.lib.bazel.bzlmod.DiscoveryFunction;
+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.SelectionFunction;
import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager;
import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryFunction;
import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryModule;
@@ -37,13 +44,16 @@
import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.RuleFactory.InvalidRuleException;
import com.google.devtools.build.lib.packages.WorkspaceFileValue;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue.SuccessfulRepositoryDirectoryValue;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction.AlreadyReportedRepositoryAccessException;
+import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException;
import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
import com.google.devtools.build.lib.skyframe.BzlCompileFunction;
import com.google.devtools.build.lib.skyframe.BzlLoadFunction;
+import com.google.devtools.build.lib.skyframe.BzlmodRepoRuleFunction;
import com.google.devtools.build.lib.skyframe.ContainingPackageLookupFunction;
import com.google.devtools.build.lib.skyframe.ExternalFilesHelper;
import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
@@ -106,10 +116,13 @@
private RecordingDifferencer differencer;
private TestStarlarkRepositoryFunction testStarlarkRepositoryFunction;
private Path rootPath;
+ private FakeRegistry.Factory registryFactory;
@Before
public void setupDelegator() throws Exception {
rootPath = scratch.dir("/outputbase");
+ scratch.file(
+ rootPath.getRelative("MODULE.bazel").getPathString(), "module(name='test',version='0.1')");
BlazeDirectories directories =
new BlazeDirectories(
new ServerDirectories(rootPath, rootPath, rootPath),
@@ -127,8 +140,8 @@
new RepositoryDelegatorFunction(
repositoryHandlers,
testStarlarkRepositoryFunction,
- new AtomicBoolean(true),
- ImmutableMap::of,
+ /* isFetch= */ new AtomicBoolean(true),
+ /* clientEnvironmentSupplier= */ ImmutableMap::of,
directories,
managedDirectoriesKnowledge,
BazelSkyframeExecutorConstants.EXTERNAL_PACKAGE_HELPER);
@@ -157,6 +170,8 @@
.getPackageFactoryBuilderForTesting(directories)
.build(ruleClassProvider, fileSystem);
+ registryFactory = new FakeRegistry.Factory();
+
HashFunction hashFunction = fileSystem.getDigestFunction().getHashFunction();
MemoizingEvaluator evaluator =
new InMemoryMemoizingEvaluator(
@@ -218,6 +233,13 @@
new IgnoredPackagePrefixesFunction(
/*ignoredPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT))
.put(SkyFunctions.RESOLVED_HASH_VALUES, new ResolvedHashesFunction())
+ .put(SkyFunctions.MODULE_FILE, new ModuleFileFunction(registryFactory, rootPath))
+ .put(SkyFunctions.DISCOVERY, new DiscoveryFunction())
+ .put(SkyFunctions.SELECTION, new SelectionFunction())
+ .put(
+ BzlmodRepoRuleValue.BZLMOD_REPO_RULE,
+ new BzlmodRepoRuleFunction(
+ pkgFactory, ruleClassProvider, directories, new BzlmodRepoRuleHelperImpl()))
.build(),
differencer);
driver = new SequentialBuildDriver(evaluator);
@@ -234,6 +256,7 @@
RepositoryDelegatorFunction.OUTPUT_VERIFICATION_REPOSITORY_RULES.set(
differencer, ImmutableSet.of());
RepositoryDelegatorFunction.RESOLVED_FILE_FOR_VERIFICATION.set(differencer, Optional.empty());
+ RepositoryDelegatorFunction.ENABLE_BZLMOD.set(differencer, true);
}
@Test
@@ -417,6 +440,51 @@
assertThat(eventHandler.getEvents()).hasSize(1);
}
+ @Test
+ public void loadRepositoryFromBzlmod() throws Exception {
+ scratch.overwriteFile(
+ rootPath.getRelative("MODULE.bazel").getPathString(),
+ "module(name='A',version='0.1')",
+ "bazel_dep(name='B',version='1.0')");
+ FakeRegistry registry =
+ registryFactory
+ .newFakeRegistry()
+ .addModule(createModuleKey("B", "1.0"), "module(name='B', version='1.0');");
+ ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of(registry.getUrl()));
+ scratch.file(rootPath.getRelative("BUILD").getPathString());
+ scratch.file(
+ rootPath.getRelative("repo_rule.bzl").getPathString(),
+ "def _impl(rctx):",
+ " rctx.file('BUILD', '')",
+ "fictive_repo_rule = repository_rule(implementation = _impl)");
+ scratch.file(
+ rootPath.getRelative("WORKSPACE").getPathString(),
+ "load(':repo_rule.bzl', 'fictive_repo_rule')",
+ "fictive_repo_rule(name = 'B')",
+ "fictive_repo_rule(name = 'C')");
+
+ StoredEventHandler eventHandler = new StoredEventHandler();
+ SkyKey key = RepositoryDirectoryValue.key(RepositoryName.createFromValidStrippedName("B"));
+ EvaluationContext evaluationContext =
+ EvaluationContext.newBuilder()
+ .setKeepGoing(false)
+ .setNumThreads(8)
+ .setEventHandler(eventHandler)
+ .build();
+ EvaluationResult<SkyValue> result = driver.evaluate(ImmutableList.of(key), evaluationContext);
+
+ // B should be fetched from MODULE.bazel file instead of WORKSPACE file.
+ // Because FakeRegistry returns a fake_http_archive_rule, the fetch should fail as expected.
+ assertThat(result.hasError()).isTrue();
+ assertThat(result.getError().getException()).isInstanceOf(InvalidRuleException.class);
+ assertThat(result.getError().getException())
+ .hasMessageThat()
+ .isEqualTo("Unrecognized native repository rule: fake_http_archive_rule");
+
+ // C should still be fetched from WORKSPACE successfully.
+ loadRepo("C");
+ }
+
private void loadRepo(String strippedRepoName) throws InterruptedException {
StoredEventHandler eventHandler = new StoredEventHandler();
SkyKey key =
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 c505e40..14d28f9 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
@@ -305,7 +305,8 @@
RepositoryDelegatorFunction.REPOSITORY_OVERRIDES, ImmutableMap.of()),
PrecomputedValue.injected(
RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING,
- RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY)));
+ RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY),
+ PrecomputedValue.injected(RepositoryDelegatorFunction.ENABLE_BZLMOD, false)));
skyframeExecutor.sync(
reporter,
packageOptions,
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 3524b12..212a6cc 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
@@ -184,6 +184,7 @@
differencer, RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY);
RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
differencer, Optional.empty());
+ RepositoryDelegatorFunction.ENABLE_BZLMOD.set(differencer, 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 cdc2e7c..83fac54 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
@@ -239,6 +239,7 @@
PrecomputedValue.STARLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT);
RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
differencer, Optional.empty());
+ RepositoryDelegatorFunction.ENABLE_BZLMOD.set(differencer, false);
return new SequentialBuildDriver(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 de4cf3b..c4a0baa 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
@@ -194,6 +194,7 @@
differencer, RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY);
RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
differencer, Optional.empty());
+ RepositoryDelegatorFunction.ENABLE_BZLMOD.set(differencer, false);
}
protected PackageLookupValue lookupPackage(String packageName) throws InterruptedException {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index 4757999..e4e0f67 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -114,7 +114,8 @@
RepositoryDelegatorFunction.REPOSITORY_OVERRIDES, ImmutableMap.of()),
PrecomputedValue.injected(
RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING,
- RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY)));
+ RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY),
+ PrecomputedValue.injected(RepositoryDelegatorFunction.ENABLE_BZLMOD, false)));
scratch.file(ADDITIONAL_IGNORED_PACKAGE_PREFIXES_FILE_PATH_STRING);
}