Skip to content

Commit 0fe3063

Browse files
fmeumcopybara-github
authored andcommitted
Let Label#debugPrint emit label strings in display form
This is a reland of 30b95e3 with a different approach to emitting display form labels that avoids adding a new `to_display_form()` method to `Label`: * In action command lines, which are the most frequent use of labels in rule implementation functions, labels are automatically emitted in display form since 9d3a8b0. * In module extensions and repository rules, if labels can be turned into display form, the inverse of the repository mapping would need to be tracked in lockfiles and marker files for correct incrementality. Furthermore, allowing implementation functions to access apparent names would allow them to "discriminate" against them, thus possibly breaking the user's capability to map repos at will via `use_repo` and `repo_name`. Similar to how providers on a target can't be enumerated, it is thus safer to not provide this information to the implementation functions directly. This change thus implements `StarlarkValue#debugPrint` for `Label` to allow ruleset authors to emit labels in display form in warnings and error messages while ensuring that Starlark logic doesn't have access to this information. `print("My message", label)` degrades gracefully with older Bazel versions (it just prints a canonical label literal) and can thus be adopted immediately without a need for feature detection. This requires changing the signature of `StarlarkValue#debugPrint` to receive the `StarlarkThread` instead of just the `StarlarkSemantics`. Since `debugPrint` is meant for emitting potentially non-deterministic information, it is safe to give it access to `StarlarkThread`. Also improves the Bzlmod cycle reporter so that it prints helpful information on a cycle encountered in a previous iteration of this PR. Fixes #20486 RELNOTES: `Label` instances passed to `print` or `fail` as positional arguments are now formatted with apparent repository names (optimized for human readability). Closes #21963. PiperOrigin-RevId: 635589078 Change-Id: If60fdc632a59f19dad0cb02312690c15a0540c8e
1 parent 1b99372 commit 0fe3063

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+413
-88
lines changed

src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java

+3-7
Original file line numberDiff line numberDiff line change
@@ -368,13 +368,9 @@ private String getProgressMessageChecked(@Nullable RepositoryMapping mainReposit
368368
private String replaceProgressMessagePlaceholders(
369369
String progressMessage, @Nullable RepositoryMapping mainRepositoryMapping) {
370370
if (progressMessage.contains("%{label}") && owner.getLabel() != null) {
371-
String labelString;
372-
if (mainRepositoryMapping != null) {
373-
labelString = owner.getLabel().getDisplayForm(mainRepositoryMapping);
374-
} else {
375-
labelString = owner.getLabel().toString();
376-
}
377-
progressMessage = progressMessage.replace("%{label}", labelString);
371+
progressMessage =
372+
progressMessage.replace(
373+
"%{label}", owner.getLabel().getDisplayForm(mainRepositoryMapping));
378374
}
379375
if (progressMessage.contains("%{output}") && getPrimaryOutput() != null) {
380376
progressMessage =

src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
package com.google.devtools.build.lib.analysis;
1616

17+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
1718
import com.google.devtools.build.lib.cmdline.Label;
18-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
1919
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2020
import javax.annotation.Nullable;
2121
import net.starlark.java.eval.EvalException;
@@ -33,7 +33,7 @@ public class BazelRuleAnalysisThreadContext extends BazelStarlarkContext {
3333
* @param ruleContext is the {@link RuleContext} of the rule for analysis of a rule or aspect
3434
*/
3535
public BazelRuleAnalysisThreadContext(RuleContext ruleContext) {
36-
super(Phase.ANALYSIS);
36+
super(Phase.ANALYSIS, ruleContext.getAnalysisEnvironment()::getMainRepoMapping);
3737
this.ruleContext = ruleContext;
3838
}
3939

src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@
3131
import com.google.devtools.build.lib.analysis.config.CoreOptions.OutputDirectoryNamingScheme;
3232
import com.google.devtools.build.lib.analysis.config.CoreOptions.OutputPathsMode;
3333
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
34+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
35+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase;
3436
import com.google.devtools.build.lib.cmdline.Label;
3537
import com.google.devtools.build.lib.cmdline.Label.PackageContext;
3638
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
3739
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
3840
import com.google.devtools.build.lib.events.Event;
3941
import com.google.devtools.build.lib.events.EventHandler;
40-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
41-
import com.google.devtools.build.lib.packages.BazelStarlarkContext.Phase;
4242
import com.google.devtools.build.lib.packages.Rule;
4343
import com.google.devtools.build.lib.packages.RuleTransitionData;
4444
import com.google.devtools.build.lib.packages.StructImpl;
@@ -552,7 +552,7 @@ public ImmutableMap<String, Map<String, Object>> evaluate(
552552
// Create a new {@link BazelStarlarkContext} for the new thread. We need to
553553
// create a new context every time because {@link BazelStarlarkContext}s
554554
// should be confined to a single thread.
555-
new BazelStarlarkContext(Phase.ANALYSIS).storeInThread(thread);
555+
new BazelStarlarkContext(Phase.ANALYSIS, /* mainRepoMapping= */ null).storeInThread(thread);
556556

557557
result =
558558
Starlark.fastcall(

src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
import net.starlark.java.eval.Dict;
5656
import net.starlark.java.eval.Printer;
5757
import net.starlark.java.eval.Starlark;
58-
import net.starlark.java.eval.StarlarkSemantics;
58+
import net.starlark.java.eval.StarlarkThread;
5959

6060
/**
6161
* A {@link com.google.devtools.build.lib.analysis.ConfiguredTarget} that is produced by a rule.
@@ -254,7 +254,7 @@ public void repr(Printer printer) {
254254
}
255255

256256
@Override
257-
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
257+
public void debugPrint(Printer printer, StarlarkThread thread) {
258258
// Show the names of the provider keys that this target propagates.
259259
// Provider key names might potentially be *private* information, and thus a comprehensive
260260
// list of provider keys should not be exposed in any way other than for debug information.

src/main/java/com/google/devtools/build/lib/analysis/starlark/Args.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void repr(Printer printer) {
7171
}
7272

7373
@Override
74-
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
74+
public void debugPrint(Printer printer, StarlarkThread thread) {
7575
try {
7676
printer.append(
7777
Joiner.on(" ").join(build(/* mainRepoMappingSupplier= */ () -> null).arguments()));

src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.google.devtools.build.lib.analysis.starlark.StarlarkAttrModule.Descriptor;
5555
import com.google.devtools.build.lib.analysis.test.TestConfiguration;
5656
import com.google.devtools.build.lib.cmdline.BazelModuleContext;
57+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
5758
import com.google.devtools.build.lib.cmdline.Label;
5859
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
5960
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
@@ -66,7 +67,6 @@
6667
import com.google.devtools.build.lib.packages.Attribute.StarlarkComputedDefaultTemplate;
6768
import com.google.devtools.build.lib.packages.AttributeTransitionData;
6869
import com.google.devtools.build.lib.packages.AttributeValueSource;
69-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
7070
import com.google.devtools.build.lib.packages.BuildSetting;
7171
import com.google.devtools.build.lib.packages.BuildType;
7272
import com.google.devtools.build.lib.packages.BuiltinRestriction;

src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BazelModuleResolutionValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
* graphs.
3030
*/
3131
@AutoValue
32-
abstract class BazelModuleResolutionValue implements SkyValue {
32+
public abstract class BazelModuleResolutionValue implements SkyValue {
3333

3434
@SerializationConstant
3535
public static final SkyKey KEY = () -> SkyFunctions.BAZEL_MODULE_RESOLUTION;

src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileValue.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public static Key key(ModuleKey moduleKey, @Nullable ModuleOverride override) {
117117
/** {@link SkyKey} for {@link ModuleFileValue} computation. */
118118
@AutoCodec
119119
@AutoValue
120-
abstract static class Key implements SkyKey {
120+
public abstract static class Key implements SkyKey {
121121
private static final SkyKeyInterner<Key> interner = SkyKey.newInterner();
122122

123123
abstract ModuleKey getModuleKey();

src/main/java/com/google/devtools/build/lib/bazel/bzlmod/NonRegistryOverride.java

+9
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
package com.google.devtools.build.lib.bazel.bzlmod;
1717

18+
import com.google.common.collect.ImmutableSet;
1819
import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleInspectorValue.AugmentedModule.ResolutionReason;
1920

2021
/**
@@ -25,6 +26,14 @@
2526
*/
2627
public interface NonRegistryOverride extends ModuleOverride {
2728

29+
// Starlark rules loaded from bazel_tools that may define Bazel module repositories with
30+
// non-registry overrides and thus must be loaded without relying on any other modules or the main
31+
// repo mapping.
32+
ImmutableSet<String> BOOTSTRAP_RULE_CLASSES =
33+
ImmutableSet.of(
34+
ArchiveRepoSpecBuilder.HTTP_ARCHIVE_PATH + "%http_archive",
35+
GitRepoSpecBuilder.GIT_REPO_PATH + "%git_repository");
36+
2837
/** Returns the {@link RepoSpec} that defines this repository. */
2938
RepoSpec getRepoSpec();
3039

src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java

+22-4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager;
3535
import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryModule.RepositoryRuleFunction;
3636
import com.google.devtools.build.lib.cmdline.BazelModuleContext;
37+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
38+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase;
3739
import com.google.devtools.build.lib.cmdline.Label;
3840
import com.google.devtools.build.lib.cmdline.LabelConstants;
3941
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
@@ -132,6 +134,12 @@ public SkyValue compute(SkyKey skyKey, Environment env)
132134
if (starlarkSemantics == null) {
133135
return null;
134136
}
137+
RepositoryMappingValue mainRepoMappingValue =
138+
(RepositoryMappingValue)
139+
env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS);
140+
if (mainRepoMappingValue == null) {
141+
return null;
142+
}
135143

136144
ModuleExtensionId extensionId = (ModuleExtensionId) skyKey.argument();
137145
SingleExtensionUsagesValue usagesValue =
@@ -182,7 +190,12 @@ public SkyValue compute(SkyKey skyKey, Environment env)
182190
// Run that extension!
183191
env.getListener().post(ModuleExtensionEvaluationProgress.ongoing(extensionId, "starting"));
184192
RunModuleExtensionResult moduleExtensionResult =
185-
extension.run(env, usagesValue, starlarkSemantics, extensionId);
193+
extension.run(
194+
env,
195+
usagesValue,
196+
starlarkSemantics,
197+
extensionId,
198+
mainRepoMappingValue.getRepositoryMapping());
186199
if (moduleExtensionResult == null) {
187200
return null;
188201
}
@@ -524,7 +537,8 @@ RunModuleExtensionResult run(
524537
Environment env,
525538
SingleExtensionUsagesValue usagesValue,
526539
StarlarkSemantics starlarkSemantics,
527-
ModuleExtensionId extensionId)
540+
ModuleExtensionId extensionId,
541+
RepositoryMapping repositoryMapping)
528542
throws InterruptedException, SingleExtensionEvalFunctionException;
529543
}
530544

@@ -676,7 +690,8 @@ public RunModuleExtensionResult run(
676690
Environment env,
677691
SingleExtensionUsagesValue usagesValue,
678692
StarlarkSemantics starlarkSemantics,
679-
ModuleExtensionId extensionId)
693+
ModuleExtensionId extensionId,
694+
RepositoryMapping mainRepositoryMapping)
680695
throws InterruptedException, SingleExtensionEvalFunctionException {
681696
var generatedRepoSpecs = ImmutableMap.<String, RepoSpec>builderWithExpectedSize(repos.size());
682697
// Instantiate the repos one by one.
@@ -845,7 +860,8 @@ public RunModuleExtensionResult run(
845860
Environment env,
846861
SingleExtensionUsagesValue usagesValue,
847862
StarlarkSemantics starlarkSemantics,
848-
ModuleExtensionId extensionId)
863+
ModuleExtensionId extensionId,
864+
RepositoryMapping mainRepositoryMapping)
849865
throws InterruptedException, SingleExtensionEvalFunctionException {
850866
ModuleExtensionEvalStarlarkThreadContext threadContext =
851867
new ModuleExtensionEvalStarlarkThreadContext(
@@ -869,6 +885,8 @@ public RunModuleExtensionResult run(
869885
thread.setPrintHandler(Event.makeDebugPrintHandler(env.getListener()));
870886
moduleContext = createContext(env, usagesValue, starlarkSemantics, extensionId);
871887
threadContext.storeInThread(thread);
888+
new BazelStarlarkContext(Phase.WORKSPACE, () -> mainRepositoryMapping)
889+
.storeInThread(thread);
872890
// This is used by the `Label()` constructor in Starlark, to record any attempts to resolve
873891
// apparent repo names to canonical repo names. See #20721 for why this is necessary.
874892
thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder);

src/main/java/com/google/devtools/build/lib/bazel/bzlmod/TypeCheckedTag.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import net.starlark.java.annot.StarlarkBuiltin;
2525
import net.starlark.java.eval.EvalException;
2626
import net.starlark.java.eval.Printer;
27-
import net.starlark.java.eval.StarlarkSemantics;
27+
import net.starlark.java.eval.StarlarkThread;
2828
import net.starlark.java.eval.Structure;
2929
import net.starlark.java.spelling.SpellChecker;
3030
import net.starlark.java.syntax.Location;
@@ -150,7 +150,7 @@ public String getErrorMessageForUnknownField(String field) {
150150
}
151151

152152
@Override
153-
public void debugPrint(Printer printer, StarlarkSemantics semantics) {
153+
public void debugPrint(Printer printer, StarlarkThread thread) {
154154
printer.append(String.format("'%s' tag at %s", tagClassName, location));
155155
}
156156
}

src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ java_library(
4646
"//src/main/java/com/google/devtools/build/lib/skyframe:directory_tree_digest_value",
4747
"//src/main/java/com/google/devtools/build/lib/skyframe:ignored_package_prefixes_value",
4848
"//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
49+
"//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value",
4950
"//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository",
5051
"//src/main/java/com/google/devtools/build/lib/util",
5152
"//src/main/java/com/google/devtools/build/lib/util:string",

src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java

+27-2
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323
import com.google.common.collect.Table;
2424
import com.google.devtools.build.lib.analysis.BlazeDirectories;
2525
import com.google.devtools.build.lib.analysis.RuleDefinition;
26+
import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride;
2627
import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent;
2728
import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager;
29+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
2830
import com.google.devtools.build.lib.cmdline.Label;
2931
import com.google.devtools.build.lib.cmdline.LabelConstants;
32+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
3033
import com.google.devtools.build.lib.cmdline.RepositoryName;
3134
import com.google.devtools.build.lib.events.Event;
32-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
3335
import com.google.devtools.build.lib.packages.Rule;
3436
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
3537
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
@@ -46,6 +48,7 @@
4648
import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor;
4749
import com.google.devtools.build.lib.skyframe.IgnoredPackagePrefixesValue;
4850
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
51+
import com.google.devtools.build.lib.skyframe.RepositoryMappingValue;
4952
import com.google.devtools.build.lib.vfs.FileSystemUtils;
5053
import com.google.devtools.build.lib.vfs.Path;
5154
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -242,6 +245,27 @@ private RepositoryDirectoryValue.Builder fetchInternal(
242245
return null;
243246
}
244247

248+
boolean enableBzlmod = starlarkSemantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD);
249+
@Nullable RepositoryMapping mainRepoMapping;
250+
String ruleClass =
251+
rule.getRuleClassObject().getRuleDefinitionEnvironmentLabel().getUnambiguousCanonicalForm()
252+
+ "%"
253+
+ rule.getRuleClass();
254+
if (NonRegistryOverride.BOOTSTRAP_RULE_CLASSES.contains(ruleClass)) {
255+
// Avoid a cycle.
256+
mainRepoMapping = null;
257+
} else if (enableBzlmod || !isWorkspaceRepo(rule)) {
258+
var mainRepoMappingValue =
259+
(RepositoryMappingValue)
260+
env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS);
261+
if (mainRepoMappingValue == null) {
262+
return null;
263+
}
264+
mainRepoMapping = mainRepoMappingValue.getRepositoryMapping();
265+
} else {
266+
mainRepoMapping = rule.getPackage().getRepositoryMapping();
267+
}
268+
245269
IgnoredPackagePrefixesValue ignoredPackagesValue =
246270
(IgnoredPackagePrefixesValue) env.getValue(IgnoredPackagePrefixesValue.key());
247271
if (env.valuesMissing()) {
@@ -264,7 +288,8 @@ private RepositoryDirectoryValue.Builder fetchInternal(
264288
thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder);
265289
}
266290

267-
new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING).storeInThread(thread); // "fetch"
291+
new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING, () -> mainRepoMapping)
292+
.storeInThread(thread); // "fetch"
268293

269294
StarlarkRepositoryContext starlarkRepositoryContext =
270295
new StarlarkRepositoryContext(

src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
import com.google.devtools.build.lib.bazel.bzlmod.ModuleExtensionEvalStarlarkThreadContext;
2929
import com.google.devtools.build.lib.bazel.bzlmod.TagClass;
3030
import com.google.devtools.build.lib.cmdline.BazelModuleContext;
31+
import com.google.devtools.build.lib.cmdline.BazelStarlarkContext;
3132
import com.google.devtools.build.lib.cmdline.Label;
3233
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
3334
import com.google.devtools.build.lib.events.EventHandler;
3435
import com.google.devtools.build.lib.packages.Attribute;
3536
import com.google.devtools.build.lib.packages.AttributeValueSource;
36-
import com.google.devtools.build.lib.packages.BazelStarlarkContext;
3737
import com.google.devtools.build.lib.packages.BzlInitThreadContext;
3838
import com.google.devtools.build.lib.packages.Package;
3939
import com.google.devtools.build.lib.packages.RuleClass;

src/main/java/com/google/devtools/build/lib/cmdline/BUILD

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ java_library(
1717
srcs = [
1818
"BazelCompileContext.java",
1919
"BazelModuleContext.java",
20+
"BazelStarlarkContext.java",
2021
"Label.java",
2122
"LabelCodec.java",
2223
"LabelConstants.java",

src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@
1111
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
14-
package com.google.devtools.build.lib.packages;
14+
package com.google.devtools.build.lib.cmdline;
1515

1616
import com.google.common.base.Preconditions;
17+
import com.google.devtools.build.lib.supplier.InterruptibleSupplier;
18+
import javax.annotation.Nullable;
1719
import net.starlark.java.eval.EvalException;
1820
import net.starlark.java.eval.Starlark;
1921
import net.starlark.java.eval.StarlarkThread;
@@ -94,19 +96,31 @@ public void storeInThread(StarlarkThread thread) {
9496

9597
// TODO(b/236456122): Eliminate Phase, migrate analysisRuleLabel to a separate context class.
9698
private final Phase phase;
99+
@Nullable private final InterruptibleSupplier<RepositoryMapping> mainRepoMappingSupplier;
97100

98101
/**
99102
* @param phase the phase to which this Starlark thread belongs
100103
*/
101-
public BazelStarlarkContext(Phase phase) {
104+
public BazelStarlarkContext(
105+
Phase phase, @Nullable InterruptibleSupplier<RepositoryMapping> mainRepoMappingSupplier) {
102106
this.phase = Preconditions.checkNotNull(phase);
107+
this.mainRepoMappingSupplier = mainRepoMappingSupplier;
103108
}
104109

105110
/** Returns the phase associated with this context. */
106111
public Phase getPhase() {
107112
return phase;
108113
}
109114

115+
/**
116+
* The repository mapping applicable to the main repository. This is purely meant to support
117+
* {@link Label#debugPrint}.
118+
*/
119+
@Nullable
120+
public RepositoryMapping getMainRepoMapping() throws InterruptedException {
121+
return mainRepoMappingSupplier == null ? null : mainRepoMappingSupplier.get();
122+
}
123+
110124
@Override
111125
public String getContextForUncheckedException() {
112126
return phase.toString();

0 commit comments

Comments
 (0)