Fix Label() behavior when called with '@repo' parts
The Label() constructor reads its repo mapping from BazelStarlarkContext, which is constructed when the thread is created. This is wrong because the repo mapping it needs is actually the one of the repo where the .bzl file lives. So we do that by having BazelModuleContext store the repo mapping (similar to how it stores the label right now) and return that. Callers who want the repo mapping (not just Label()) now get it from the topmost stack frame rather than from the BazelStarlarkContext, which no longer carries a repo mapping.
This coincidentally also fixes Label() behavior when called from a Bzlmod environment (either extension impl functions, or repo rules; see https://github.com/bazelbuild/bazel/issues/13316), because we simply don't have a BazelStarlarkContext in those cases.
Fixes https://github.com/bazelbuild/bazel/issues/12963.
PiperOrigin-RevId: 401732211
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index abff653..150a8d3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -44,7 +44,6 @@
import com.google.devtools.build.lib.analysis.starlark.StarlarkModules;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import com.google.devtools.build.lib.graph.Digraph;
import com.google.devtools.build.lib.graph.Node;
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
@@ -860,13 +859,11 @@
}
@Override
- public void setStarlarkThreadContext(
- StarlarkThread thread, Label fileLabel, RepositoryMapping repoMapping) {
+ public void setStarlarkThreadContext(StarlarkThread thread, Label fileLabel) {
new BazelStarlarkContext(
BazelStarlarkContext.Phase.LOADING,
toolsRepository,
configurationFragmentMap,
- repoMapping,
/*convertedLabelsInPackage=*/ new HashMap<>(),
new SymbolGenerator<>(fileLabel),
/*analysisRuleLabel=*/ null,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 8f1baf4..ea265cf 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -1127,7 +1127,6 @@
BazelStarlarkContext.Phase.ANALYSIS,
ruleClassProvider.getToolsRepository(),
/*fragmentNameToClass=*/ null,
- getTarget().getPackage().getRepositoryMapping(),
/*convertedLabelsInPackage=*/ new HashMap<>(),
getSymbolGenerator(),
getLabel(),
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
index ac8a957..d0de3c3 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
@@ -205,10 +205,10 @@
StarlarkSemantics semantics,
Label parentLabel,
Location location,
- BazelStarlarkContext starlarkContext)
+ RepositoryMapping repoMapping)
throws EvalException {
return new RegularTransition(
- impl, inputs, outputs, semantics, parentLabel, location, starlarkContext.getRepoMapping());
+ impl, inputs, outputs, semantics, parentLabel, location, repoMapping);
}
public static StarlarkDefinedConfigTransition newAnalysisTestTransition(
@@ -350,7 +350,6 @@
Phase.ANALYSIS,
/*toolsRepository=*/ null,
/*fragmentNameToClass=*/ null,
- repoMapping,
/*convertedLabelsInPackage=*/ new HashMap<>(),
dummySymbolGenerator,
parentLabel,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
index 6f560f8..9cdf069 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
@@ -45,6 +45,7 @@
import com.google.devtools.build.lib.starlarkbuildapi.StarlarkAttrModuleApi;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.FileTypeSet;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
@@ -137,13 +138,12 @@
} else if (defaultValue instanceof StarlarkLateBoundDefault) {
builder.value((StarlarkLateBoundDefault) defaultValue); // unchecked cast
} else {
- BazelStarlarkContext bazelStarlarkContext = BazelStarlarkContext.from(thread);
+ BazelModuleContext moduleContext =
+ BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread));
builder.defaultValue(
defaultValue,
new BuildType.LabelConversionContext(
- BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread)).label(),
- bazelStarlarkContext.getRepoMapping(),
- bazelStarlarkContext.getConvertedLabelsInPackage()),
+ moduleContext.label(), moduleContext.repoMapping(), new HashMap<>()),
DEFAULT_ARG);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
index b645b93..96b7ef0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
@@ -557,10 +557,12 @@
Iterable<String> inputs, StarlarkThread thread, String adjective) throws EvalException {
ImmutableList.Builder<Label> parsedLabels = new ImmutableList.Builder<>();
BazelStarlarkContext bazelStarlarkContext = BazelStarlarkContext.from(thread);
+ BazelModuleContext moduleContext =
+ BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread));
LabelConversionContext context =
new LabelConversionContext(
- BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread)).label(),
- bazelStarlarkContext.getRepoMapping(),
+ moduleContext.label(),
+ moduleContext.repoMapping(),
bazelStarlarkContext.getConvertedLabelsInPackage());
for (String input : inputs) {
try {
@@ -958,8 +960,6 @@
@Override
public Label label(String labelString, StarlarkThread thread) throws EvalException {
- BazelStarlarkContext context = BazelStarlarkContext.from(thread);
-
// This function is surprisingly complex.
//
// - The logic to find the "current repo" is rather magical, using dynamic scope:
@@ -984,16 +984,14 @@
// and cache without needing four allocations (parseAbsoluteLabel,
// getRelativeWithRemapping, getUnambiguousCanonicalForm, parseAbsoluteLabel
// in labelCache)
-
- // This is the label of the innermost BUILD/.bzl file on the current call stack.
- Label parentLabel =
- BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread)).label();
-
+ BazelModuleContext moduleContext =
+ BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread));
try {
LabelValidator.parseAbsoluteLabel(labelString);
labelString =
- parentLabel
- .getRelativeWithRemapping(labelString, context.getRepoMapping())
+ moduleContext
+ .label()
+ .getRelativeWithRemapping(labelString, moduleContext.repoMapping())
.getUnambiguousCanonicalForm();
return labelCache.get(labelString);
} catch (LabelValidator.BadLabelException | LabelSyntaxException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java
index 0f211e1..be94b83 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java
@@ -89,11 +89,12 @@
} else if (key instanceof String) {
try {
BazelStarlarkContext bazelStarlarkContext = BazelStarlarkContext.from(starlarkThread);
+ BazelModuleContext moduleContext =
+ BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(starlarkThread));
LabelConversionContext context =
new LabelConversionContext(
- BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(starlarkThread))
- .label(),
- bazelStarlarkContext.getRepoMapping(),
+ moduleContext.label(),
+ moduleContext.repoMapping(),
bazelStarlarkContext.getConvertedLabelsInPackage());
return context.convert((String) key);
} catch (LabelSyntaxException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
index 35ba226..90414eb 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java
@@ -158,7 +158,6 @@
BazelStarlarkContext.Phase.LOADING, // ("fetch")
/*toolsRepository=*/ null,
/*fragmentNameToClass=*/ null,
- rule.getPackage().getRepositoryMapping(),
/*convertedLabelsInPackage=*/ new HashMap<>(),
new SymbolGenerator<>(key),
/*analysisRuleLabel=*/ null,
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index 70626d1..0127833 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -548,17 +548,19 @@
useStarlarkThread = true)
public Label getRelative(String relName, StarlarkThread thread) throws LabelSyntaxException {
HasRepoMapping hrm = thread.getThreadLocal(HasRepoMapping.class);
- return getRelativeWithRemapping(relName, hrm.getRepoMapping());
+ return getRelativeWithRemapping(relName, hrm.getRepoMappingForCurrentBzlFile(thread));
}
/**
- * An interface for retrieving a repository mapping.
+ * An interface for retrieving a repository mapping that's applicable for the repo containing the
+ * current .bzl file (more precisely, the .bzl file where the function at the innermost Starlark
+ * stack frame lives).
*
* <p>This has only a single implementation, {@code BazelStarlarkContext}, but we can't mention
* that type here because logically it belongs in Bazel, above this package.
*/
public interface HasRepoMapping {
- RepositoryMapping getRepoMapping();
+ RepositoryMapping getRepoMappingForCurrentBzlFile(StarlarkThread thread);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java b/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java
index 175b60f..462d41a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelModuleContext.java
@@ -17,6 +17,7 @@
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import net.starlark.java.eval.Module;
/**
@@ -28,6 +29,9 @@
/** Label associated with the Starlark {@link net.starlark.java.eval.Module}. */
public abstract Label label();
+ /** The repository mapping applicable to the repo where the .bzl file is located in. */
+ public abstract RepositoryMapping repoMapping();
+
/** Returns the name of the module's .bzl file, as provided to the parser. */
public abstract String filename();
@@ -64,9 +68,11 @@
public static BazelModuleContext create(
Label label,
+ RepositoryMapping repoMapping,
String filename,
ImmutableMap<String, Module> loads,
byte[] bzlTransitiveDigest) {
- return new AutoValue_BazelModuleContext(label, filename, loads, bzlTransitiveDigest);
+ return new AutoValue_BazelModuleContext(
+ label, repoMapping, filename, loads, bzlTransitiveDigest);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
index ed66d7b..8a43420 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
@@ -25,6 +25,7 @@
import java.util.Optional;
import javax.annotation.Nullable;
import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkThread;
@@ -63,7 +64,6 @@
@Nullable private final String toolsRepository;
// Only necessary for loading phase threads to construct configuration_field.
@Nullable private final ImmutableMap<String, Class<?>> fragmentNameToClass;
- private final RepositoryMapping repoMapping;
private final HashMap<String, Label> convertedLabelsInPackage;
private final SymbolGenerator<?> symbolGenerator;
@Nullable private final Label analysisRuleLabel;
@@ -77,7 +77,6 @@
* @param fragmentNameToClass a map from configuration fragment name to configuration fragment
* class, such as "apple" to AppleConfiguration.class for loading phase threads, null for
* other threads.
- * @param repoMapping a map from RepositoryName to RepositoryName to be used for external
* @param convertedLabelsInPackage a mutable map from String to Label, used during package loading
* of a single package.
* @param symbolGenerator a {@link SymbolGenerator} to be used when creating objects to be
@@ -90,14 +89,12 @@
// separate structs, exactly one of which is populated (plus the common fields). And eliminate
// StarlarkUtils.Phase.
// TODO(adonovan): move PackageFactory.PackageContext in here, for loading-phase threads.
- // TODO(adonovan): add a PackageIdentifier here, for use by the Starlark Label function.
// TODO(adonovan): is there any reason not to put the entire RuleContext in this thread, for
// analysis threads?
public BazelStarlarkContext(
Phase phase,
@Nullable String toolsRepository,
@Nullable ImmutableMap<String, Class<?>> fragmentNameToClass,
- RepositoryMapping repoMapping,
HashMap<String, Label> convertedLabelsInPackage,
SymbolGenerator<?> symbolGenerator,
@Nullable Label analysisRuleLabel,
@@ -105,7 +102,6 @@
this.phase = Preconditions.checkNotNull(phase);
this.toolsRepository = toolsRepository;
this.fragmentNameToClass = fragmentNameToClass;
- this.repoMapping = repoMapping;
this.convertedLabelsInPackage = convertedLabelsInPackage;
this.symbolGenerator = Preconditions.checkNotNull(symbolGenerator);
this.analysisRuleLabel = analysisRuleLabel;
@@ -130,8 +126,11 @@
* in the BUILD files and the values are new repository names chosen by the main repository.
*/
@Override
- public RepositoryMapping getRepoMapping() {
- return repoMapping;
+ public RepositoryMapping getRepoMappingForCurrentBzlFile(StarlarkThread thread) {
+ // TODO(b/200024947): Find a better place for this. We don't want Label to have to depend on
+ // StarlarkModuleContext, but having the logic in BazelStarlarkContext is purely a historical
+ // misstep.
+ return BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread)).repoMapping();
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index aa2ca22..dd57fe7 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -661,7 +661,6 @@
BazelStarlarkContext.Phase.LOADING,
ruleClassProvider.getToolsRepository(),
/*fragmentNameToClass=*/ null,
- pkgBuilder.getRepositoryMapping(),
pkgBuilder.getConvertedLabelsInPackage(),
new SymbolGenerator<>(pkgBuilder.getPackageIdentifier()),
/*analysisRuleLabel=*/ null,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index bc68664..2db7de3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -17,7 +17,6 @@
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import com.google.devtools.build.lib.packages.RuleClass.Builder.ThirdPartyLicenseExistencePolicy;
import com.google.devtools.build.lib.vfs.Root;
import java.util.Map;
@@ -65,9 +64,8 @@
*
* @param thread StarlarkThread in which to store the context.
* @param label the label of the .bzl file
- * @param repoMapping map of RepositoryNames to be remapped
*/
- void setStarlarkThreadContext(StarlarkThread thread, Label label, RepositoryMapping repoMapping);
+ void setStarlarkThreadContext(StarlarkThread thread, Label label);
/**
* Returns all the predeclared top-level symbols (for .bzl files) that belong to native rule sets,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index ff69a23..7e7c547 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -18,7 +18,6 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedSet;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
-import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.NullEventHandler;
@@ -138,7 +137,6 @@
BazelStarlarkContext.Phase.WORKSPACE,
/*toolsRepository=*/ null,
/*fragmentNameToClass=*/ null,
- /*repoMapping=*/ RepositoryMapping.ALWAYS_FALLBACK,
/*convertedLabelsInPackage=*/ new HashMap<>(),
new SymbolGenerator<>(workspaceFileKey),
/*analysisRuleLabel=*/ null,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
index a7ad193..65d345e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
@@ -20,9 +20,7 @@
import com.google.devtools.build.lib.analysis.config.StarlarkDefinedConfigTransition;
import com.google.devtools.build.lib.analysis.config.StarlarkDefinedConfigTransition.Settings;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import com.google.devtools.build.lib.packages.BazelModuleContext;
-import com.google.devtools.build.lib.packages.BazelStarlarkContext;
import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigGlobalLibraryApi;
import com.google.devtools.build.lib.starlarkbuildapi.config.ConfigurationTransitionApi;
import java.util.HashSet;
@@ -57,12 +55,17 @@
List<String> outputsList = Sequence.cast(outputs, String.class, "outputs");
validateBuildSettingKeys(inputsList, Settings.INPUTS);
validateBuildSettingKeys(outputsList, Settings.OUTPUTS);
- Label parentLabel =
- BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread)).label();
+ BazelModuleContext moduleContext =
+ BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread));
Location location = thread.getCallerLocation();
- BazelStarlarkContext context = BazelStarlarkContext.from(thread);
return StarlarkDefinedConfigTransition.newRegularTransition(
- implementation, inputsList, outputsList, semantics, parentLabel, location, context);
+ implementation,
+ inputsList,
+ outputsList,
+ semantics,
+ moduleContext.label(),
+ location,
+ moduleContext.repoMapping());
}
@Override
@@ -73,12 +76,11 @@
Map<String, Object> changedSettingsMap =
Dict.cast(changedSettings, String.class, Object.class, "changed_settings dict");
validateBuildSettingKeys(changedSettingsMap.keySet(), Settings.OUTPUTS);
- RepositoryMapping repoMapping = BazelStarlarkContext.from(thread).getRepoMapping();
- Label parentLabel =
- BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread)).label();
+ BazelModuleContext moduleContext =
+ BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread));
Location location = thread.getCallerLocation();
return StarlarkDefinedConfigTransition.newAnalysisTestTransition(
- changedSettingsMap, repoMapping, parentLabel, location);
+ changedSettingsMap, moduleContext.repoMapping(), moduleContext.label(), location);
}
private void validateBuildSettingKeys(Iterable<String> optionKeys, Settings keyErrorDescriptor)
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 a1c07d7..936fbc9 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
@@ -788,18 +788,16 @@
Module module = Module.withPredeclared(builtins.starlarkSemantics, predeclared);
module.setClientData(
BazelModuleContext.create(
- key.getLabel(), prog.getFilename(), ImmutableMap.copyOf(loadMap), transitiveDigest));
+ key.getLabel(),
+ repoMapping,
+ prog.getFilename(),
+ ImmutableMap.copyOf(loadMap),
+ transitiveDigest));
// executeBzlFile may post events to the Environment's handler, but events do not matter when
// caching BzlLoadValues. Note that executing the code mutates the module.
executeBzlFile(
- prog,
- key.getLabel(),
- module,
- loadMap,
- builtins.starlarkSemantics,
- env.getListener(),
- repoMapping);
+ prog, key.getLabel(), module, loadMap, builtins.starlarkSemantics, env.getListener());
return new BzlLoadValue(module, transitiveDigest);
}
@@ -1073,17 +1071,14 @@
Module module,
Map<String, Module> loadedModules,
StarlarkSemantics starlarkSemantics,
- ExtendedEventHandler skyframeEventHandler,
- RepositoryMapping repositoryMapping)
+ ExtendedEventHandler skyframeEventHandler)
throws BzlLoadFailedException, InterruptedException {
try (Mutability mu = Mutability.create("loading", label)) {
StarlarkThread thread = new StarlarkThread(mu, starlarkSemantics);
thread.setLoader(loadedModules::get);
StoredEventHandler starlarkEventHandler = new StoredEventHandler();
thread.setPrintHandler(Event.makeDebugPrintHandler(starlarkEventHandler));
- packageFactory
- .getRuleClassProvider()
- .setStarlarkThreadContext(thread, label, repositoryMapping);
+ packageFactory.getRuleClassProvider().setStarlarkThreadContext(thread, label);
execAndExport(prog, label, starlarkEventHandler, module, thread);
Event.replayEventsOn(skyframeEventHandler, starlarkEventHandler.getEvents());
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
index b13458e..aa72101 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
@@ -668,7 +668,62 @@
assertThat(result.get(skyKey).getModule().getGlobal("data")).isEqualTo("get up at 6am.");
}
- // TODO(wyv): labels_constructedInModuleExtension
+ @Test
+ public void labels_constructedInModuleExtension() throws Exception {
+ scratch.file(
+ workspaceRoot.getRelative("MODULE.bazel").getPathString(),
+ "bazel_dep(name='ext',version='1.0')",
+ "ext = use_extension('@ext//:defs.bzl','ext')",
+ "ext.tag()",
+ "use_repo(ext,'ext_repo')");
+ scratch.file(workspaceRoot.getRelative("BUILD").getPathString());
+ scratch.file(
+ workspaceRoot.getRelative("data.bzl").getPathString(),
+ "load('@ext_repo//:data.bzl', ext_data='data')",
+ "data=ext_data");
+
+ registry.addModule(createModuleKey("foo", "1.0"), "module(name='foo',version='1.0')");
+ scratch.file(modulesRoot.getRelative("foo.1.0/WORKSPACE").getPathString());
+ scratch.file(modulesRoot.getRelative("foo.1.0/BUILD").getPathString());
+ scratch.file(
+ modulesRoot.getRelative("foo.1.0/requirements.txt").getPathString(), "get up at 6am.");
+ registry.addModule(createModuleKey("bar", "2.0"), "module(name='bar',version='2.0')");
+ scratch.file(modulesRoot.getRelative("bar.2.0/WORKSPACE").getPathString());
+ scratch.file(modulesRoot.getRelative("bar.2.0/BUILD").getPathString());
+ scratch.file(
+ modulesRoot.getRelative("bar.2.0/requirements.txt").getPathString(), "go to bed at 11pm.");
+
+ registry.addModule(
+ createModuleKey("ext", "1.0"),
+ "module(name='ext',version='1.0')",
+ "bazel_dep(name='foo',version='1.0')",
+ "bazel_dep(name='bar',version='2.0')",
+ "bazel_dep(name='data_repo',version='1.0')");
+ scratch.file(modulesRoot.getRelative("ext.1.0/WORKSPACE").getPathString());
+ scratch.file(modulesRoot.getRelative("ext.1.0/BUILD").getPathString());
+ scratch.file(
+ modulesRoot.getRelative("ext.1.0/defs.bzl").getPathString(),
+ "load('@data_repo//:defs.bzl','data_repo')",
+ "def _ext_impl(ctx):",
+ // The Label() call on the following line should work, using ext.1.0's repo mapping.
+ " data_str = 'requirements: ' + ctx.read(Label('@foo//:requirements.txt')).strip()",
+ " for mod in ctx.modules:",
+ " for tag in mod.tags.tag:",
+ " data_str += ' ' + ctx.read(tag.file).strip()",
+ " data_repo(name='ext_repo',data=data_str)",
+ // So should the attr.label default value on the following line.
+ "tag=tag_class(attrs={'file':attr.label(default='@bar//:requirements.txt')})",
+ "ext=module_extension(implementation=_ext_impl,tag_classes={'tag':tag})");
+
+ SkyKey skyKey = BzlLoadValue.keyForBuild(Label.parseAbsoluteUnchecked("//:data.bzl"));
+ EvaluationResult<BzlLoadValue> result =
+ driver.evaluate(ImmutableList.of(skyKey), evaluationContext);
+ if (result.hasError()) {
+ throw result.getError().getException();
+ }
+ assertThat(result.get(skyKey).getModule().getGlobal("data"))
+ .isEqualTo("requirements: get up at 6am. go to bed at 11pm.");
+ }
@Test
public void generatedReposHaveCorrectMappings() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java b/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
index 7ee391b..439ef2c 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/util/BazelEvaluationTestCase.java
@@ -128,7 +128,6 @@
BazelStarlarkContext.Phase.LOADING,
TestConstants.TOOLS_REPOSITORY,
/*fragmentNameToClass=*/ null,
- /*repoMapping=*/ RepositoryMapping.ALWAYS_FALLBACK,
/*convertedLabelsInPackage=*/ new HashMap<>(),
new SymbolGenerator<>(new Object()),
/*analysisRuleLabel=*/ null,
@@ -143,6 +142,7 @@
// Return the module's client data. (This one uses dummy values for tests.)
return BazelModuleContext.create(
Label.parseAbsoluteUnchecked("//test:label"),
+ RepositoryMapping.ALWAYS_FALLBACK,
"test/label.bzl",
/*loads=*/ ImmutableMap.of(),
/*bzlTransitiveDigest=*/ new byte[0]);