Skip to content

Commit a757852

Browse files
fmeumcopybara-github
authored andcommitted
Decanonicalize labels emitted by {a,c,}query if possible
Uses the newly added `PackageIdentifier#getDisplayForm` to turn labels in the output of query, aquery, and cquery into the most concise representation that allows them to be resolved from the context of the main repository. Closes bazelbuild#16483. PiperOrigin-RevId: 485584469 Change-Id: I9037bf128713af75b6741eca42b25e3beeb112f7
1 parent 8f95651 commit a757852

34 files changed

+280
-75
lines changed

src/main/java/com/google/devtools/build/lib/cmdline/Label.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -419,9 +419,19 @@ public String getCanonicalForm() {
419419
* Label.parse*(x.getUnambiguousCanonicalForm(), ...).equals(x)}).
420420
*/
421421
public String getUnambiguousCanonicalForm() {
422-
return String.format(
423-
"@@%s//%s:%s",
424-
packageIdentifier.getRepository().getName(), packageIdentifier.getPackageFragment(), name);
422+
return packageIdentifier.getUnambiguousCanonicalForm() + ":" + name;
423+
}
424+
425+
/**
426+
* Returns a label string that is suitable for display, i.e., it resolves to this label when
427+
* parsed in the context of the main repository and has a repository part that is as simple as
428+
* possible.
429+
*
430+
* @param mainRepositoryMapping the {@link RepositoryMapping} of the main repository
431+
* @return analogous to {@link PackageIdentifier#getDisplayForm(RepositoryMapping)}
432+
*/
433+
public String getDisplayForm(RepositoryMapping mainRepositoryMapping) {
434+
return packageIdentifier.getDisplayForm(mainRepositoryMapping) + ":" + name;
425435
}
426436

427437
/** Return the name of the repository label refers to without the leading `at` symbol. */

src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
2929
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
3030
import com.google.devtools.build.lib.cmdline.Label;
31+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
3132
import com.google.devtools.build.lib.cmdline.TargetParsingException;
3233
import com.google.devtools.build.lib.cmdline.TargetPattern;
3334
import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet;
@@ -251,6 +252,11 @@ protected TargetPattern getPattern(String pattern) throws TargetParsingException
251252
return mainRepoTargetParser.parse(pattern);
252253
}
253254

255+
@Override
256+
public RepositoryMapping getMainRepoMapping() {
257+
return mainRepoTargetParser.getRepoMapping();
258+
}
259+
254260
public ThreadSafeMutableSet<T> getFwdDeps(Iterable<T> targets) throws InterruptedException {
255261
Map<SkyKey, T> targetsByKey = Maps.newHashMapWithExpectedSize(Iterables.size(targets));
256262
for (T target : targets) {

src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java

+7
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.google.devtools.build.lib.cmdline.Label;
4343
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
4444
import com.google.devtools.build.lib.cmdline.ParallelVisitor.VisitTaskStatusCallback;
45+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
4546
import com.google.devtools.build.lib.cmdline.SignedTargetPattern;
4647
import com.google.devtools.build.lib.cmdline.TargetParsingException;
4748
import com.google.devtools.build.lib.cmdline.TargetPattern;
@@ -965,6 +966,12 @@ public TargetAccessor<Target> getAccessor() {
965966
return accessor;
966967
}
967968

969+
@Override
970+
@ThreadSafe
971+
public RepositoryMapping getMainRepoMapping() {
972+
return mainRepoTargetParser.getRepoMapping();
973+
}
974+
968975
@ThreadSafe
969976
private Package getPackage(PackageIdentifier packageIdentifier)
970977
throws InterruptedException, QueryException, NoSuchPackageException {

src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,13 @@ public ConfiguredTargetValueAccessor getAccessor() {
170170
StreamedOutputHandler.OutputType.JSON,
171171
actionFilters),
172172
new ActionGraphTextOutputFormatterCallback(
173-
eventHandler, aqueryOptions, out, skyframeExecutor, accessor, actionFilters),
173+
eventHandler,
174+
aqueryOptions,
175+
out,
176+
skyframeExecutor,
177+
accessor,
178+
actionFilters,
179+
getMainRepoMapping()),
174180
new ActionGraphSummaryOutputFormatterCallback(
175181
eventHandler, aqueryOptions, out, skyframeExecutor, accessor, actionFilters));
176182
}

src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
3939
import com.google.devtools.build.lib.buildeventstream.BuildEvent;
4040
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
41+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
4142
import com.google.devtools.build.lib.events.ExtendedEventHandler;
4243
import com.google.devtools.build.lib.packages.AspectDescriptor;
4344
import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor;
@@ -62,6 +63,7 @@ class ActionGraphTextOutputFormatterCallback extends AqueryThreadsafeCallback {
6263

6364
private final ActionKeyContext actionKeyContext = new ActionKeyContext();
6465
private final AqueryActionFilter actionFilters;
66+
private final RepositoryMapping mainRepoMapping;
6567
private Map<String, String> paramFileNameToContentMap;
6668

6769
ActionGraphTextOutputFormatterCallback(
@@ -70,9 +72,11 @@ class ActionGraphTextOutputFormatterCallback extends AqueryThreadsafeCallback {
7072
OutputStream out,
7173
SkyframeExecutor skyframeExecutor,
7274
TargetAccessor<KeyedConfiguredTargetValue> accessor,
73-
AqueryActionFilter actionFilters) {
75+
AqueryActionFilter actionFilters,
76+
RepositoryMapping mainRepoMapping) {
7477
super(eventHandler, options, out, skyframeExecutor, accessor);
7578
this.actionFilters = actionFilters;
79+
this.mainRepoMapping = mainRepoMapping;
7680
}
7781

7882
@Override
@@ -145,15 +149,15 @@ private void writeAction(ActionAnalysisMetadata action, PrintStream printStream)
145149

146150
stringBuilder
147151
.append(" Target: ")
148-
.append(actionOwner.getLabel())
152+
.append(actionOwner.getLabel().getDisplayForm(mainRepoMapping))
149153
.append('\n')
150154
.append(" Configuration: ")
151155
.append(configProto.getMnemonic())
152156
.append('\n');
153157
if (actionOwner.getExecutionPlatform() != null) {
154158
stringBuilder
155159
.append(" Execution platform: ")
156-
.append(actionOwner.getExecutionPlatform().label().toString())
160+
.append(actionOwner.getExecutionPlatform().label().getDisplayForm(mainRepoMapping))
157161
.append("\n");
158162
}
159163

src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java

+18-4
Original file line numberDiff line numberDiff line change
@@ -205,17 +205,30 @@ private static ImmutableMap<String, BuildConfigurationValue> getTransitiveConfig
205205
cqueryOptions.aspectDeps.createResolver(packageManager, eventHandler);
206206
return ImmutableList.of(
207207
new LabelAndConfigurationOutputFormatterCallback(
208-
eventHandler, cqueryOptions, out, skyframeExecutor, accessor, true),
208+
eventHandler,
209+
cqueryOptions,
210+
out,
211+
skyframeExecutor,
212+
accessor,
213+
true,
214+
getMainRepoMapping()),
209215
new LabelAndConfigurationOutputFormatterCallback(
210-
eventHandler, cqueryOptions, out, skyframeExecutor, accessor, false),
216+
eventHandler,
217+
cqueryOptions,
218+
out,
219+
skyframeExecutor,
220+
accessor,
221+
false,
222+
getMainRepoMapping()),
211223
new TransitionsOutputFormatterCallback(
212224
eventHandler,
213225
cqueryOptions,
214226
out,
215227
skyframeExecutor,
216228
accessor,
217229
hostConfiguration,
218-
trimmingTransitionFactory),
230+
trimmingTransitionFactory,
231+
getMainRepoMapping()),
219232
new ProtoOutputFormatterCallback(
220233
eventHandler,
221234
cqueryOptions,
@@ -251,7 +264,8 @@ private static ImmutableMap<String, BuildConfigurationValue> getTransitiveConfig
251264
out,
252265
skyframeExecutor,
253266
accessor,
254-
kct -> getFwdDeps(ImmutableList.of(kct))),
267+
kct -> getFwdDeps(ImmutableList.of(kct)),
268+
getMainRepoMapping()),
255269
new StarlarkOutputFormatterCallback(
256270
eventHandler, cqueryOptions, out, skyframeExecutor, accessor),
257271
new FilesOutputFormatterCallback(

src/main/java/com/google/devtools/build/lib/query2/cquery/GraphOutputFormatterCallback.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import com.google.common.collect.ImmutableSet;
1818
import com.google.devtools.build.lib.cmdline.Label;
19+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
1920
import com.google.devtools.build.lib.events.ExtendedEventHandler;
2021
import com.google.devtools.build.lib.graph.Digraph;
2122
import com.google.devtools.build.lib.graph.Node;
@@ -65,12 +66,15 @@ Iterable<KeyedConfiguredTarget> getDirectDeps(KeyedConfiguredTarget target)
6566
};
6667

6768
@Override
68-
public String getLabel(Node<KeyedConfiguredTarget> node) {
69+
public String getLabel(
70+
Node<KeyedConfiguredTarget> node, RepositoryMapping mainRepositoryMapping) {
6971
// Node payloads are ConfiguredTargets. Output node labels are target labels + config
7072
// hashes.
7173
KeyedConfiguredTarget kct = node.getLabel();
7274
return String.format(
73-
"%s (%s)", kct.getLabel(), shortId(getConfiguration(kct.getConfigurationKey())));
75+
"%s (%s)",
76+
kct.getLabel().getDisplayForm(mainRepositoryMapping),
77+
shortId(getConfiguration(kct.getConfigurationKey())));
7478
}
7579

7680
@Override
@@ -79,15 +83,19 @@ public Comparator<KeyedConfiguredTarget> comparator() {
7983
}
8084
};
8185

86+
private final RepositoryMapping mainRepoMapping;
87+
8288
GraphOutputFormatterCallback(
8389
ExtendedEventHandler eventHandler,
8490
CqueryOptions options,
8591
OutputStream out,
8692
SkyframeExecutor skyframeExecutor,
8793
TargetAccessor<KeyedConfiguredTarget> accessor,
88-
DepsRetriever depsRetriever) {
94+
DepsRetriever depsRetriever,
95+
RepositoryMapping mainRepoMapping) {
8996
super(eventHandler, options, out, skyframeExecutor, accessor, /*uniquifyResults=*/ false);
9097
this.depsRetriever = depsRetriever;
98+
this.mainRepoMapping = mainRepoMapping;
9199
}
92100

93101
@Override
@@ -117,7 +125,8 @@ public void processOutput(Iterable<KeyedConfiguredTarget> partialResult)
117125
// select() conditions don't matter for cquery because cquery operates post-analysis
118126
// phase, when select()s have been resolved and removed from the graph.
119127
/*maxConditionalEdges=*/ 0,
120-
options.graphFactored);
128+
options.graphFactored,
129+
mainRepoMapping);
121130
graphWriter.write(graph, /*conditionalEdges=*/ null, outputStream);
122131
}
123132
}

src/main/java/com/google/devtools/build/lib/query2/cquery/LabelAndConfigurationOutputFormatterCallback.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.google.devtools.build.lib.analysis.RequiredConfigFragmentsProvider;
1919
import com.google.devtools.build.lib.analysis.config.CoreOptions.IncludeConfigFragmentsEnum;
2020
import com.google.devtools.build.lib.cmdline.Label;
21+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
2122
import com.google.devtools.build.lib.events.ExtendedEventHandler;
2223
import com.google.devtools.build.lib.packages.Target;
2324
import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor;
@@ -28,16 +29,19 @@
2829
/** Default Output callback for cquery. Prints a label and configuration pair per result. */
2930
public class LabelAndConfigurationOutputFormatterCallback extends CqueryThreadsafeCallback {
3031
private final boolean showKind;
32+
private final RepositoryMapping mainRepoMapping;
3133

3234
LabelAndConfigurationOutputFormatterCallback(
3335
ExtendedEventHandler eventHandler,
3436
CqueryOptions options,
3537
OutputStream out,
3638
SkyframeExecutor skyframeExecutor,
3739
TargetAccessor<KeyedConfiguredTarget> accessor,
38-
boolean showKind) {
40+
boolean showKind,
41+
RepositoryMapping mainRepoMapping) {
3942
super(eventHandler, options, out, skyframeExecutor, accessor, /*uniquifyResults=*/ false);
4043
this.showKind = showKind;
44+
this.mainRepoMapping = mainRepoMapping;
4145
}
4246

4347
@Override
@@ -55,7 +59,7 @@ public void processOutput(Iterable<KeyedConfiguredTarget> partialResult) {
5559
}
5660
output =
5761
output
58-
.append(keyedConfiguredTarget.getLabel())
62+
.append(keyedConfiguredTarget.getLabel().getDisplayForm(mainRepoMapping))
5963
.append(" (")
6064
.append(shortId(getConfiguration(keyedConfiguredTarget.getConfigurationKey())))
6165
.append(")");

src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java

+11-3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
2828
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
2929
import com.google.devtools.build.lib.cmdline.Label;
30+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
3031
import com.google.devtools.build.lib.events.Event;
3132
import com.google.devtools.build.lib.events.ExtendedEventHandler;
3233
import com.google.devtools.build.lib.packages.RuleTransitionData;
@@ -48,6 +49,7 @@ class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback {
4849

4950
private final HashMap<Label, Target> partialResultMap;
5051
@Nullable private final TransitionFactory<RuleTransitionData> trimmingTransitionFactory;
52+
private final RepositoryMapping mainRepoMapping;
5153

5254
@Override
5355
public String getName() {
@@ -65,11 +67,13 @@ public String getName() {
6567
SkyframeExecutor skyframeExecutor,
6668
TargetAccessor<KeyedConfiguredTarget> accessor,
6769
BuildConfigurationValue hostConfiguration,
68-
@Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory) {
70+
@Nullable TransitionFactory<RuleTransitionData> trimmingTransitionFactory,
71+
RepositoryMapping mainRepoMapping) {
6972
super(eventHandler, options, out, skyframeExecutor, accessor, /*uniquifyResults=*/ false);
7073
this.hostConfiguration = hostConfiguration;
7174
this.trimmingTransitionFactory = trimmingTransitionFactory;
7275
this.partialResultMap = Maps.newHashMap();
76+
this.mainRepoMapping = mainRepoMapping;
7377
}
7478

7579
@Override
@@ -92,7 +96,11 @@ public void processOutput(Iterable<KeyedConfiguredTarget> partialResult)
9296
getRuleClassTransition(keyedConfiguredTarget.getConfiguredTarget(), target)
9397
+ String.format(
9498
"%s (%s)",
95-
keyedConfiguredTarget.getConfiguredTarget().getOriginalLabel(), shortId(config)));
99+
keyedConfiguredTarget
100+
.getConfiguredTarget()
101+
.getOriginalLabel()
102+
.getDisplayForm(mainRepoMapping),
103+
shortId(config)));
96104
KnownTargetsDependencyResolver knownTargetsDependencyResolver =
97105
new KnownTargetsDependencyResolver(partialResultMap);
98106
ImmutableSet<ResolvedTransition> dependencies;
@@ -117,7 +125,7 @@ public void processOutput(Iterable<KeyedConfiguredTarget> partialResult)
117125
" "
118126
.concat(dep.attributeName())
119127
.concat("#")
120-
.concat(dep.label().toString())
128+
.concat(dep.label().getDisplayForm(mainRepoMapping))
121129
.concat("#")
122130
.concat(dep.transitionName())
123131
.concat(" -> ")

src/main/java/com/google/devtools/build/lib/query2/engine/QueryEnvironment.java

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.common.collect.ImmutableSet;
2020
import com.google.common.util.concurrent.ListenableFuture;
2121
import com.google.devtools.build.lib.cmdline.Label;
22+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
2223
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
2324
import com.google.devtools.build.lib.packages.Target;
2425
import com.google.devtools.build.lib.util.DetailedExitCode;
@@ -567,6 +568,13 @@ ThreadSafeMutableSet<T> getBuildFiles(
567568
*/
568569
TargetAccessor<T> getAccessor();
569570

571+
/**
572+
* Returns the {@link RepositoryMapping} of the main repository so that output formatters can
573+
* resolve canonical repository names in labels back to the more readable local names used by the
574+
* main repository.
575+
*/
576+
RepositoryMapping getMainRepoMapping();
577+
570578
/**
571579
* Whether the given setting is enabled. The code should default to return {@code false} for all
572580
* unknown settings. The enum is used rather than a method for each setting so that adding more

src/main/java/com/google/devtools/build/lib/query2/query/BlazeQueryEnvironment.java

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.common.collect.ImmutableList;
2121
import com.google.devtools.build.lib.cmdline.Label;
2222
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
23+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
2324
import com.google.devtools.build.lib.cmdline.TargetParsingException;
2425
import com.google.devtools.build.lib.cmdline.TargetPattern;
2526
import com.google.devtools.build.lib.cmdline.TargetPattern.Parser;
@@ -500,6 +501,11 @@ public TargetAccessor<Target> getAccessor() {
500501
return accessor;
501502
}
502503

504+
@Override
505+
public RepositoryMapping getMainRepoMapping() {
506+
return mainRepoTargetParser.getRepoMapping();
507+
}
508+
503509
/** Given a set of target nodes, returns the targets. */
504510
private ThreadSafeMutableSet<Target> getTargetsFromNodes(Iterable<Node<Target>> input) {
505511
ThreadSafeMutableSet<Target> result = createThreadSafeMutableSet();

src/main/java/com/google/devtools/build/lib/query2/query/GraphlessBlazeQueryEnvironment.java

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.google.common.collect.Sets;
1818
import com.google.devtools.build.lib.cmdline.Label;
1919
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
20+
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
2021
import com.google.devtools.build.lib.cmdline.TargetParsingException;
2122
import com.google.devtools.build.lib.cmdline.TargetPattern;
2223
import com.google.devtools.build.lib.cmdline.TargetPattern.Parser;
@@ -507,4 +508,9 @@ protected void preloadOrThrow(QueryExpression caller, Collection<String> pattern
507508
public TargetAccessor<Target> getAccessor() {
508509
return accessor;
509510
}
511+
512+
@Override
513+
public RepositoryMapping getMainRepoMapping() {
514+
return mainRepoTargetParser.getRepoMapping();
515+
}
510516
}

0 commit comments

Comments
 (0)