Attempt #2 at adding BazelContext to the Label constructor.

The first attempt broke rules_closure in CI, which was fixed by unknown commit.

RELNOTES: None
PiperOrigin-RevId: 229307422
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java
index 682e433..689e57b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelStarlarkContext.java
@@ -42,7 +42,11 @@
     this.repoMapping = repoMapping;
   }
 
-  /** @param toolsRepository the name of the tools repository, such as "bazel_tools" */
+  /**
+   * @param toolsRepository the name of the tools repository, such as "@bazel_tools"
+   * @param repoMapping a map from RepositoryName to RepositoryName to be used for external
+   *     repository renaming
+   */
   public BazelStarlarkContext(
       String toolsRepository, ImmutableMap<RepositoryName, RepositoryName> repoMapping) {
     this(toolsRepository, null, repoMapping);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index 0eac93e..4639d41 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -753,9 +753,16 @@
 
   @Override
   public Label label(
-      String labelString, Boolean relativeToCallerRepository, Location loc, Environment env)
+      String labelString,
+      Boolean relativeToCallerRepository,
+      Location loc,
+      Environment env,
+      StarlarkContext context)
       throws EvalException {
-    Label parentLabel = null;
+
+    BazelStarlarkContext bazelStarlarkContext = (BazelStarlarkContext) context;
+
+    Label parentLabel;
     if (relativeToCallerRepository) {
       parentLabel = env.getCallerLabel();
     } else {
@@ -764,10 +771,9 @@
     try {
       if (parentLabel != null) {
         LabelValidator.parseAbsoluteLabel(labelString);
-        // TODO(dannark): pass the environment here
         labelString =
             parentLabel
-                .getRelativeWithRemapping(labelString, ImmutableMap.of())
+                .getRelativeWithRemapping(labelString, bazelStarlarkContext.getRepoMapping())
                 .getUnambiguousCanonicalForm();
       }
       return labelCache.get(labelString);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index 62f5e14..5958424 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
+import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
 import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent;
 import com.google.devtools.build.lib.bazel.repository.downloader.HttpDownloader;
 import com.google.devtools.build.lib.cmdline.LabelConstants;
@@ -88,6 +89,13 @@
           com.google.devtools.build.lib.syntax.Environment.builder(mutability)
               .setSemantics(skylarkSemantics)
               .setEventHandler(env.getListener())
+              // The fetch phase does not need the tools repository or the fragment map because
+              // it happens before analysis.
+              .setStarlarkContext(
+                  new BazelStarlarkContext(
+                      /* toolsRepository = */ null,
+                      /* fragmentNameToClass = */ null,
+                      rule.getPackage().getRepositoryMapping()))
               .build();
       SkylarkRepositoryContext skylarkRepositoryContext =
           new SkylarkRepositoryContext(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
index a849c6c..74f1453 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
@@ -496,34 +496,42 @@
 
   @SkylarkCallable(
       name = "Label",
-      doc = "Creates a Label referring to a BUILD target. Use "
-          + "this function only when you want to give a default value for the label attributes. "
-          + "The argument must refer to an absolute label. "
-          + "Example: <br><pre class=language-python>Label(\"//tools:default\")</pre>",
+      doc =
+          "Creates a Label referring to a BUILD target. Use "
+              + "this function only when you want to give a default value for the label "
+              + "attributes. The argument must refer to an absolute label. "
+              + "Example: <br><pre class=language-python>Label(\"//tools:default\")</pre>",
       parameters = {
-          @Param(name = "label_string", type = String.class, legacyNamed = true,
-              doc = "the label string."),
-          @Param(
-              name = "relative_to_caller_repository",
-              type = Boolean.class,
-              defaultValue = "False",
-              named = true,
-              positional = false,
-              doc = "Deprecated. Do not use. "
-                  + "When relative_to_caller_repository is True and the calling thread is a rule's "
-                  + "implementation function, then a repo-relative label //foo:bar is resolved "
-                  + "relative to the rule's repository.  For calls to Label from any other "
-                  + "thread, or calls in which the relative_to_caller_repository flag is False, "
-                  + "a repo-relative label is resolved relative to the file in which the "
-                  + "Label() call appears."
-          )
+        @Param(
+            name = "label_string",
+            type = String.class,
+            legacyNamed = true,
+            doc = "the label string."),
+        @Param(
+            name = "relative_to_caller_repository",
+            type = Boolean.class,
+            defaultValue = "False",
+            named = true,
+            positional = false,
+            doc =
+                "Deprecated. Do not use. "
+                    + "When relative_to_caller_repository is True and the calling thread is a "
+                    + "rule's implementation function, then a repo-relative label //foo:bar is "
+                    + "resolved relative to the rule's repository.  For calls to Label from any "
+                    + "other thread, or calls in which the relative_to_caller_repository flag is "
+                    + "False, a repo-relative label is resolved relative to the file in which the "
+                    + "Label() call appears.")
       },
       useLocation = true,
-      useEnvironment = true
-  )
+      useEnvironment = true,
+      useContext = true)
   @SkylarkConstructor(objectType = Label.class)
   public Label label(
-      String labelString, Boolean relativeToCallerRepository, Location loc, Environment env)
+      String labelString,
+      Boolean relativeToCallerRepository,
+      Location loc,
+      Environment env,
+      StarlarkContext context)
       throws EvalException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
index 90260c1..9690686 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
@@ -149,8 +149,13 @@
   }
 
   @Override
-  public Label label(String labelString, Boolean relativeToCallerRepository, Location loc,
-      Environment env) throws EvalException {
+  public Label label(
+      String labelString,
+      Boolean relativeToCallerRepository,
+      Location loc,
+      Environment env,
+      StarlarkContext context)
+      throws EvalException {
     try {
       return Label.parseAbsolute(
           labelString,