diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/BUILD index 88a90f3fd78b80..c10ae9dfecebf8 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/BUILD @@ -26,6 +26,8 @@ java_library( "//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:config/build_configuration", + "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:registry", + "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution", "//src/main/java/com/google/devtools/build/lib/bazel/commands", "//src/main/java/com/google/devtools/build/lib/bazel/repository", "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", 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 2c061ec68978ea..2cdee580c48a54 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 @@ -25,6 +25,11 @@ import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.bazel.bzlmod.DiscoveryFunction; +import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; +import com.google.devtools.build.lib.bazel.bzlmod.RegistryFactory; +import com.google.devtools.build.lib.bazel.bzlmod.RegistryFactoryImpl; +import com.google.devtools.build.lib.bazel.bzlmod.SelectionFunction; import com.google.devtools.build.lib.bazel.commands.FetchCommand; import com.google.devtools.build.lib.bazel.commands.SyncCommand; import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformFunction; @@ -87,6 +92,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -98,6 +104,10 @@ public class BazelRepositoryModule extends BlazeModule { // Default location (relative to output user root) of the repository cache. public static final String DEFAULT_CACHE_LOCATION = "cache/repos/v1"; + // Default list of registries. + public static final ImmutableList DEFAULT_REGISTRIES = + ImmutableList.of("https://bcr.bazel.build/"); + // A map of repository handlers that can be looked up by rule class name. private final ImmutableMap repositoryHandlers; private final AtomicBoolean isFetch = new AtomicBoolean(false); @@ -115,6 +125,7 @@ public class BazelRepositoryModule extends BlazeModule { private Optional resolvedFileReplacingWorkspace = Optional.empty(); private Set outputVerificationRules = ImmutableSet.of(); private FileSystem filesystem; + private List registries; // We hold the precomputed value of the managed directories here, so that the dependency // on WorkspaceFileValue is not registered for each FileStateValue. private final ManagedDirectoriesKnowledgeImpl managedDirectoriesKnowledge; @@ -202,6 +213,13 @@ public void workspaceInit( managedDirectoriesKnowledge, BazelSkyframeExecutorConstants.EXTERNAL_PACKAGE_HELPER); builder.addSkyFunction(SkyFunctions.REPOSITORY_DIRECTORY, repositoryDelegatorFunction); + RegistryFactory registryFactory = + new RegistryFactoryImpl(new HttpDownloader(), clientEnvironmentSupplier); + builder.addSkyFunction( + SkyFunctions.MODULE_FILE, + new ModuleFileFunction(registryFactory, directories.getWorkspace())); + builder.addSkyFunction(SkyFunctions.DISCOVERY, new DiscoveryFunction()); + builder.addSkyFunction(SkyFunctions.SELECTION, new SelectionFunction()); filesystem = runtime.getFileSystem(); } @@ -335,6 +353,12 @@ public void beforeCommand(CommandEnvironment env) throws AbruptExitException { overrides = ImmutableMap.of(); } + if (repoOptions.registries != null && !repoOptions.registries.isEmpty()) { + registries = repoOptions.registries; + } else { + registries = DEFAULT_REGISTRIES; + } + if (!Strings.isNullOrEmpty(repoOptions.repositoryHashFile)) { Path hashFile; if (env.getWorkspace() != null) { @@ -394,7 +418,8 @@ public ImmutableList getPrecomputedValues() { RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY), PrecomputedValue.injected( RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_CONFIGURING, - RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY)); + RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY), + PrecomputedValue.injected(ModuleFileFunction.REGISTRIES, registries)); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD index 46ee3857f39adc..ae09b9a503e20d 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/BUILD @@ -44,7 +44,6 @@ java_library( "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//src/main/java/net/starlark/java/eval", - "//src/main/java/net/starlark/java/syntax", "//third_party:apache_commons_compress", "//third_party:auto_value", "//third_party:flogger", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java index ba79637c74da88..8558e285cf3d7e 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java @@ -46,6 +46,18 @@ public class RepositoryOptions extends OptionsBase { + "as argument requests the cache to be disabled.") public PathFragment experimentalRepositoryCache; + @Option( + name = "registry", + defaultValue = "null", + allowMultiple = true, + documentationCategory = OptionDocumentationCategory.BAZEL_CLIENT_OPTIONS, + effectTags = {OptionEffectTag.CHANGES_INPUTS}, + help = + "Specifies the registries to use to locate Bazel module dependencies. The order is" + + " important: modules will be looked up in earlier registries first, and only fall" + + " back to later registries when they're missing from the earlier ones.") + public List registries; + @Option( name = "experimental_repository_cache_hardlinks", defaultValue = "false",