diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java index 6b8dcb74f0e82c..2d4eda3a738c81 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java +++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java @@ -368,13 +368,9 @@ private String getProgressMessageChecked(@Nullable RepositoryMapping mainReposit private String replaceProgressMessagePlaceholders( String progressMessage, @Nullable RepositoryMapping mainRepositoryMapping) { if (progressMessage.contains("%{label}") && owner.getLabel() != null) { - String labelString; - if (mainRepositoryMapping != null) { - labelString = owner.getLabel().getDisplayForm(mainRepositoryMapping); - } else { - labelString = owner.getLabel().toString(); - } - progressMessage = progressMessage.replace("%{label}", labelString); + progressMessage = + progressMessage.replace( + "%{label}", owner.getLabel().getDisplayForm(mainRepositoryMapping)); } if (progressMessage.contains("%{output}") && getPrimaryOutput() != null) { progressMessage = diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java index 21767620d49135..ff214d1ab79e57 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java @@ -14,8 +14,8 @@ package com.google.devtools.build.lib.analysis; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; import com.google.errorprone.annotations.CanIgnoreReturnValue; import javax.annotation.Nullable; import net.starlark.java.eval.EvalException; @@ -33,7 +33,7 @@ public class BazelRuleAnalysisThreadContext extends BazelStarlarkContext { * @param ruleContext is the {@link RuleContext} of the rule for analysis of a rule or aspect */ public BazelRuleAnalysisThreadContext(RuleContext ruleContext) { - super(Phase.ANALYSIS); + super(Phase.ANALYSIS, ruleContext.getAnalysisEnvironment()::getMainRepoMapping); this.ruleContext = ruleContext; } 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 77c39d9f1800f0..6eff8d3eccb942 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 @@ -31,14 +31,14 @@ import com.google.devtools.build.lib.analysis.config.CoreOptions.OutputDirectoryNamingScheme; import com.google.devtools.build.lib.analysis.config.CoreOptions.OutputPathsMode; import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.Label.PackageContext; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; -import com.google.devtools.build.lib.packages.BazelStarlarkContext.Phase; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleTransitionData; import com.google.devtools.build.lib.packages.StructImpl; @@ -552,7 +552,7 @@ public ImmutableMap> evaluate( // Create a new {@link BazelStarlarkContext} for the new thread. We need to // create a new context every time because {@link BazelStarlarkContext}s // should be confined to a single thread. - new BazelStarlarkContext(Phase.ANALYSIS).storeInThread(thread); + new BazelStarlarkContext(Phase.ANALYSIS, /* mainRepoMapping= */ null).storeInThread(thread); result = Starlark.fastcall( diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java index d44f51037a19e0..1ad0e808dfaa3b 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java @@ -55,7 +55,7 @@ import net.starlark.java.eval.Dict; import net.starlark.java.eval.Printer; import net.starlark.java.eval.Starlark; -import net.starlark.java.eval.StarlarkSemantics; +import net.starlark.java.eval.StarlarkThread; /** * A {@link com.google.devtools.build.lib.analysis.ConfiguredTarget} that is produced by a rule. @@ -254,7 +254,7 @@ public void repr(Printer printer) { } @Override - public void debugPrint(Printer printer, StarlarkSemantics semantics) { + public void debugPrint(Printer printer, StarlarkThread thread) { // Show the names of the provider keys that this target propagates. // Provider key names might potentially be *private* information, and thus a comprehensive // list of provider keys should not be exposed in any way other than for debug information. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java index cade026c9edd4b..b451eb528cddc9 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java @@ -71,7 +71,7 @@ public void repr(Printer printer) { } @Override - public void debugPrint(Printer printer, StarlarkSemantics semantics) { + public void debugPrint(Printer printer, StarlarkThread thread) { try { printer.append( Joiner.on(" ").join(build(/* mainRepoMappingSupplier= */ () -> null).arguments())); 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 b7ed56111ae821..02d2a8227d13d8 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 @@ -54,6 +54,7 @@ import com.google.devtools.build.lib.analysis.starlark.StarlarkAttrModule.Descriptor; import com.google.devtools.build.lib.analysis.test.TestConfiguration; import com.google.devtools.build.lib.cmdline.BazelModuleContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.RepositoryMapping; @@ -66,7 +67,6 @@ import com.google.devtools.build.lib.packages.Attribute.StarlarkComputedDefaultTemplate; import com.google.devtools.build.lib.packages.AttributeTransitionData; import com.google.devtools.build.lib.packages.AttributeValueSource; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; import com.google.devtools.build.lib.packages.BuildSetting; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.BuiltinRestriction; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java index 5b1d45e5abd450..3dc6849db48f4b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java @@ -29,7 +29,7 @@ * graphs. */ @AutoValue -abstract class BazelModuleResolutionValue implements SkyValue { +public abstract class BazelModuleResolutionValue implements SkyValue { @SerializationConstant public static final SkyKey KEY = () -> SkyFunctions.BAZEL_MODULE_RESOLUTION; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileValue.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileValue.java index da64efb9ff5e97..c6a8d08bea9ad1 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileValue.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileValue.java @@ -117,7 +117,7 @@ public static Key key(ModuleKey moduleKey, @Nullable ModuleOverride override) { /** {@link SkyKey} for {@link ModuleFileValue} computation. */ @AutoCodec @AutoValue - abstract static class Key implements SkyKey { + public abstract static class Key implements SkyKey { private static final SkyKeyInterner interner = SkyKey.newInterner(); abstract ModuleKey getModuleKey(); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/NonRegistryOverride.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/NonRegistryOverride.java index 8ec22314e9d0c0..a5464d828a2e50 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/NonRegistryOverride.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/NonRegistryOverride.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.bazel.bzlmod; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleInspectorValue.AugmentedModule.ResolutionReason; /** @@ -25,6 +26,14 @@ */ public interface NonRegistryOverride extends ModuleOverride { + // Starlark rules loaded from bazel_tools that may define Bazel module repositories with + // non-registry overrides and thus must be loaded without relying on any other modules or the main + // repo mapping. + ImmutableSet BOOTSTRAP_RULE_CLASSES = + ImmutableSet.of( + ArchiveRepoSpecBuilder.HTTP_ARCHIVE_PATH + "%http_archive", + GitRepoSpecBuilder.GIT_REPO_PATH + "%git_repository"); + /** Returns the {@link RepoSpec} that defines this repository. */ RepoSpec getRepoSpec(); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java index 755284f305fa14..5fc38d2940550a 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java @@ -34,6 +34,8 @@ import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryModule.RepositoryRuleFunction; import com.google.devtools.build.lib.cmdline.BazelModuleContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; @@ -132,6 +134,12 @@ public SkyValue compute(SkyKey skyKey, Environment env) if (starlarkSemantics == null) { return null; } + RepositoryMappingValue mainRepoMappingValue = + (RepositoryMappingValue) + env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS); + if (mainRepoMappingValue == null) { + return null; + } ModuleExtensionId extensionId = (ModuleExtensionId) skyKey.argument(); SingleExtensionUsagesValue usagesValue = @@ -182,7 +190,12 @@ public SkyValue compute(SkyKey skyKey, Environment env) // Run that extension! env.getListener().post(ModuleExtensionEvaluationProgress.ongoing(extensionId, "starting")); RunModuleExtensionResult moduleExtensionResult = - extension.run(env, usagesValue, starlarkSemantics, extensionId); + extension.run( + env, + usagesValue, + starlarkSemantics, + extensionId, + mainRepoMappingValue.getRepositoryMapping()); if (moduleExtensionResult == null) { return null; } @@ -524,7 +537,8 @@ RunModuleExtensionResult run( Environment env, SingleExtensionUsagesValue usagesValue, StarlarkSemantics starlarkSemantics, - ModuleExtensionId extensionId) + ModuleExtensionId extensionId, + RepositoryMapping repositoryMapping) throws InterruptedException, SingleExtensionEvalFunctionException; } @@ -676,7 +690,8 @@ public RunModuleExtensionResult run( Environment env, SingleExtensionUsagesValue usagesValue, StarlarkSemantics starlarkSemantics, - ModuleExtensionId extensionId) + ModuleExtensionId extensionId, + RepositoryMapping mainRepositoryMapping) throws InterruptedException, SingleExtensionEvalFunctionException { var generatedRepoSpecs = ImmutableMap.builderWithExpectedSize(repos.size()); // Instantiate the repos one by one. @@ -845,7 +860,8 @@ public RunModuleExtensionResult run( Environment env, SingleExtensionUsagesValue usagesValue, StarlarkSemantics starlarkSemantics, - ModuleExtensionId extensionId) + ModuleExtensionId extensionId, + RepositoryMapping mainRepositoryMapping) throws InterruptedException, SingleExtensionEvalFunctionException { ModuleExtensionEvalStarlarkThreadContext threadContext = new ModuleExtensionEvalStarlarkThreadContext( @@ -869,6 +885,8 @@ public RunModuleExtensionResult run( thread.setPrintHandler(Event.makeDebugPrintHandler(env.getListener())); moduleContext = createContext(env, usagesValue, starlarkSemantics, extensionId); threadContext.storeInThread(thread); + new BazelStarlarkContext(Phase.WORKSPACE, () -> mainRepositoryMapping) + .storeInThread(thread); // This is used by the `Label()` constructor in Starlark, to record any attempts to resolve // apparent repo names to canonical repo names. See #20721 for why this is necessary. thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/TypeCheckedTag.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/TypeCheckedTag.java index b9601be57ff8b9..e6d5c4eb21d16f 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/TypeCheckedTag.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/TypeCheckedTag.java @@ -24,7 +24,7 @@ import net.starlark.java.annot.StarlarkBuiltin; import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Printer; -import net.starlark.java.eval.StarlarkSemantics; +import net.starlark.java.eval.StarlarkThread; import net.starlark.java.eval.Structure; import net.starlark.java.spelling.SpellChecker; import net.starlark.java.syntax.Location; @@ -150,7 +150,7 @@ public String getErrorMessageForUnknownField(String field) { } @Override - public void debugPrint(Printer printer, StarlarkSemantics semantics) { + public void debugPrint(Printer printer, StarlarkThread thread) { printer.append(String.format("'%s' tag at %s", tagClassName, location)); } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD index bbc23ef10fe95f..ec879778d6d0b1 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD @@ -46,6 +46,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe:directory_tree_digest_value", "//src/main/java/com/google/devtools/build/lib/skyframe:ignored_package_prefixes_value", "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value", + "//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value", "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository", "//src/main/java/com/google/devtools/build/lib/util", "//src/main/java/com/google/devtools/build/lib/util:string", 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 63545a9f3e0fa9..478d99a4c011f6 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 @@ -23,13 +23,15 @@ import com.google.common.collect.Table; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride; import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; +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.packages.BazelStarlarkContext; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; @@ -46,6 +48,7 @@ import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor; import com.google.devtools.build.lib.skyframe.IgnoredPackagePrefixesValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; +import com.google.devtools.build.lib.skyframe.RepositoryMappingValue; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -242,6 +245,27 @@ private RepositoryDirectoryValue.Builder fetchInternal( return null; } + boolean enableBzlmod = starlarkSemantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD); + @Nullable RepositoryMapping mainRepoMapping; + String ruleClass = + rule.getRuleClassObject().getRuleDefinitionEnvironmentLabel().getUnambiguousCanonicalForm() + + "%" + + rule.getRuleClass(); + if (NonRegistryOverride.BOOTSTRAP_RULE_CLASSES.contains(ruleClass)) { + // Avoid a cycle. + mainRepoMapping = null; + } else if (enableBzlmod || !isWorkspaceRepo(rule)) { + var mainRepoMappingValue = + (RepositoryMappingValue) + env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS); + if (mainRepoMappingValue == null) { + return null; + } + mainRepoMapping = mainRepoMappingValue.getRepositoryMapping(); + } else { + mainRepoMapping = rule.getPackage().getRepositoryMapping(); + } + IgnoredPackagePrefixesValue ignoredPackagesValue = (IgnoredPackagePrefixesValue) env.getValue(IgnoredPackagePrefixesValue.key()); if (env.valuesMissing()) { @@ -264,7 +288,8 @@ private RepositoryDirectoryValue.Builder fetchInternal( thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder); } - new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING).storeInThread(thread); // "fetch" + new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING, () -> mainRepoMapping) + .storeInThread(thread); // "fetch" StarlarkRepositoryContext starlarkRepositoryContext = new StarlarkRepositoryContext( diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java index 4c43f17b824358..2a14a9ed5cde52 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java @@ -28,12 +28,12 @@ import com.google.devtools.build.lib.bazel.bzlmod.ModuleExtensionEvalStarlarkThreadContext; import com.google.devtools.build.lib.bazel.bzlmod.TagClass; import com.google.devtools.build.lib.cmdline.BazelModuleContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.AttributeValueSource; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; import com.google.devtools.build.lib.packages.BzlInitThreadContext; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.RuleClass; diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD index 89ab67d81d099f..87ab69d0557309 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD @@ -17,6 +17,7 @@ java_library( srcs = [ "BazelCompileContext.java", "BazelModuleContext.java", + "BazelStarlarkContext.java", "Label.java", "LabelCodec.java", "LabelConstants.java", diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java similarity index 90% rename from src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java rename to src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java index 325628b4c408a3..d9dcd10fa583ed 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java @@ -11,9 +11,11 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.packages; +package com.google.devtools.build.lib.cmdline; import com.google.common.base.Preconditions; +import com.google.devtools.build.lib.supplier.InterruptibleSupplier; +import javax.annotation.Nullable; import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Starlark; import net.starlark.java.eval.StarlarkThread; @@ -94,12 +96,15 @@ public void storeInThread(StarlarkThread thread) { // TODO(b/236456122): Eliminate Phase, migrate analysisRuleLabel to a separate context class. private final Phase phase; + @Nullable private final InterruptibleSupplier mainRepoMappingSupplier; /** * @param phase the phase to which this Starlark thread belongs */ - public BazelStarlarkContext(Phase phase) { + public BazelStarlarkContext( + Phase phase, @Nullable InterruptibleSupplier mainRepoMappingSupplier) { this.phase = Preconditions.checkNotNull(phase); + this.mainRepoMappingSupplier = mainRepoMappingSupplier; } /** Returns the phase associated with this context. */ @@ -107,6 +112,15 @@ public Phase getPhase() { return phase; } + /** + * The repository mapping applicable to the main repository. This is purely meant to support + * {@link Label#debugPrint}. + */ + @Nullable + public RepositoryMapping getMainRepoMapping() throws InterruptedException { + return mainRepoMappingSupplier == null ? null : mainRepoMappingSupplier.get(); + } + @Override public String getContextForUncheckedException() { return phase.toString(); 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 3d2443802e1ff4..8bc742638e7ed5 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 @@ -63,10 +63,14 @@ name = "Label", category = DocCategory.BUILTIN, doc = - "A BUILD target identifier." - + "

For every Label instance l, the string representation" - + " str(l) has the property that Label(str(l)) == l," - + " regardless of where the Label() call occurs.") + "A BUILD target identifier.

For every Label instance l, the" + + " string representation str(l) has the property that Label(str(l))" + + " == l, regardless of where the Label() call occurs.

When" + + " passed as positional arguments to print() or fail()," + + " Label use a string representation optimized for human readability" + + " instead. This representation uses an apparent repository name from" + + " the perspective of the main repository if possible.") @Immutable @ThreadSafe public final class Label implements Comparable

only with Bzlmod if the current package belongs to a repository that is not visible * from the main module */ - public String getDisplayForm(RepositoryMapping mainRepositoryMapping) { + public String getDisplayForm(@Nullable RepositoryMapping mainRepositoryMapping) { return repository.getDisplayForm(mainRepositoryMapping) + "//" + pkgName; } diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java index 3747008f2cc58a..d7435f7fb68251 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java @@ -249,13 +249,15 @@ public String getCanonicalForm() { *
@protobuf *
if this repository is a WORKSPACE dependency and its name is "protobuf", * or if this repository is a Bzlmod dependency of the main module and its apparent name - * is "protobuf" + * is "protobuf" (in both cases only if mainRepositoryMapping is not null) *
@@protobuf~3.19.2 *
only with Bzlmod, if this a repository that is not visible from the main module */ - public String getDisplayForm(RepositoryMapping mainRepositoryMapping) { + public String getDisplayForm(@Nullable RepositoryMapping mainRepositoryMapping) { Preconditions.checkArgument( - mainRepositoryMapping.ownerRepo() == null || mainRepositoryMapping.ownerRepo().isMain()); + mainRepositoryMapping == null + || mainRepositoryMapping.ownerRepo() == null + || mainRepositoryMapping.ownerRepo().isMain()); if (!isVisible()) { return getNameWithAt(); } @@ -263,6 +265,9 @@ public String getDisplayForm(RepositoryMapping mainRepositoryMapping) { // Packages in the main repository can always use repo-relative form. return ""; } + if (mainRepositoryMapping == null) { + return getNameWithAt(); + } if (!mainRepositoryMapping.usesStrictDeps()) { // If the main repository mapping is not using strict visibility, then Bzlmod is certainly // disabled, which means that canonical and apparent names can be used interchangeably from diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java b/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java index 2ae17ab4924e3c..eda38a5761e8c1 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java +++ b/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java @@ -15,6 +15,7 @@ import com.google.devtools.build.docgen.annot.GlobalMethods; import com.google.devtools.build.docgen.annot.GlobalMethods.Environment; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.packages.TargetDefinitionContext.NameConflictException; diff --git a/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java b/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java index 757f74278c442e..571a62c6eba233 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java +++ b/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java @@ -16,7 +16,9 @@ import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.util.Optional; @@ -57,15 +59,16 @@ public final class BzlInitThreadContext extends BazelStarlarkContext * @param networkAllowlistForTests an allowlist for rule classes created by this thread * @param fragmentNameToClass a map from configuration fragment name to configuration fragment * class, such as "apple" to AppleConfiguration.class - * @param symbolGenerator symbol generator for this context + * @param mainRepoMapping the repository mapping of the main repository */ public BzlInitThreadContext( Label bzlFile, byte[] transitiveDigest, RepositoryName toolsRepository, Optional