From 87325e5ac476736d83420888d53ced3631b350c9 Mon Sep 17 00:00:00 2001 From: pcloudy Date: Wed, 7 Jul 2021 04:03:14 -0700 Subject: [PATCH] bzlmod: Support creating Starlark repo rule Related: https://github.com/bazelbuild/bazel/issues/13316 RELNOTES: None. PiperOrigin-RevId: 383380283 --- .../google/devtools/build/lib/skyframe/BUILD | 1 + .../lib/skyframe/BzlmodRepoRuleFunction.java | 90 +++++++++++++- .../bzlmod/BzlmodRepoRuleFunctionTest.java | 110 ++++++++++++++++-- 3 files changed, 190 insertions(+), 11 deletions(-) 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 7ec0aeda47b93f..2fd26d1221d53f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD @@ -274,6 +274,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/analysis/platform", "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils", "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:common", + "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:repo_rule_creator", "//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/bugreport", diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java index 6e5ab7bd1fc3ad..f01c3e48669001 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java @@ -14,13 +14,18 @@ package com.google.devtools.build.lib.skyframe; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.bazel.bzlmod.BzlmodRepoRuleCreator; import com.google.devtools.build.lib.bazel.bzlmod.BzlmodRepoRuleHelper; import com.google.devtools.build.lib.bazel.bzlmod.BzlmodRepoRuleValue; import com.google.devtools.build.lib.bazel.bzlmod.RepoSpec; +import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; +import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.PackageFactory; @@ -30,6 +35,8 @@ import com.google.devtools.build.lib.packages.RuleFactory; import com.google.devtools.build.lib.packages.RuleFactory.BuildLangTypedAttributeValuesMap; import com.google.devtools.build.lib.packages.RuleFactory.InvalidRuleException; +import com.google.devtools.build.lib.server.FailureDetails.PackageLoading; +import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; @@ -39,6 +46,7 @@ import com.google.devtools.build.skyframe.SkyValue; import java.util.Optional; import javax.annotation.Nullable; +import net.starlark.java.eval.Module; import net.starlark.java.eval.StarlarkSemantics; import net.starlark.java.eval.StarlarkThread.CallStackEntry; import net.starlark.java.syntax.Location; @@ -54,6 +62,7 @@ public final class BzlmodRepoRuleFunction implements SkyFunction { private final RuleClassProvider ruleClassProvider; private final BlazeDirectories directories; private final BzlmodRepoRuleHelper bzlmodRepoRuleHelper; + private static final PackageIdentifier ROOT_PACKAGE = PackageIdentifier.createInMainRepo(""); public BzlmodRepoRuleFunction( PackageFactory packageFactory, @@ -112,8 +121,7 @@ private BzlmodRepoRuleValue createRuleFromSpec( if (repoSpec.isNativeRepoRule()) { return createNativeRepoRule(repoSpec, starlarkSemantics, env); } - // TODO(pcloudy): Implement creating starlark repository rule - return BzlmodRepoRuleValue.REPO_RULE_NOT_FOUND_VALUE; + return createStarlarkRepoRule(repoSpec, starlarkSemantics, env); } private BzlmodRepoRuleValue createNativeRepoRule( @@ -145,6 +153,84 @@ private BzlmodRepoRuleValue createNativeRepoRule( return new BzlmodRepoRuleValue(rule); } + /** Loads modules from the given bzl file. */ + private ImmutableMap loadBzlModules(Environment env, String bzlFile) + throws InterruptedException, BzlmodRepoRuleFunctionException { + ImmutableList> programLoads = + ImmutableList.of(Pair.of(bzlFile, Location.BUILTIN)); + + ImmutableList