Skip to content

Commit

Permalink
Improve Starlark exec transition debug output:
Browse files Browse the repository at this point in the history
- use the event logger to make it easier to see the output
- include the source config's checksum and both output config's checksums
- clean up formatting

This output triggers on `--experimental_exec_config_diff`.

For example:

```
$ bazel build  --nobuild  //testapp:g --experimental_exec_config=//:exec_platforms.bzl%standard_exec_transition --experimental_exec_config_diff
```

Still experimental: may not work with off-the-shelf bazel.

PiperOrigin-RevId: 554963238
Change-Id: Id60d534c90bd0a7d75ecdf30e34069448c9f73fc
  • Loading branch information
gregestren authored and copybara-github committed Aug 8, 2023
1 parent 1f44634 commit 4e525df
Showing 1 changed file with 33 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;
import com.google.common.flogger.GoogleLogger;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.BuildOptionsView;
import com.google.devtools.build.lib.analysis.config.CoreOptions;
Expand All @@ -40,7 +39,6 @@
* results. For Bazel developer debugging.
*/
public class ComparingTransition implements PatchTransition {
private static final GoogleLogger logger = GoogleLogger.forEnclosingClass();

private final ConfigurationTransition activeTransition;
private final String activeTransitionDesc;
Expand Down Expand Up @@ -86,8 +84,10 @@ public BuildOptions patch(BuildOptionsView buildOptions, EventHandler eventHandl
eventHandler.handle(Event.error(activeTransitionDesc + " transition failed"));
} else if (runBoth.test(buildOptions.underlying())) {
compare(
buildOptions.underlying(),
activeOptions.getValue(),
Iterables.getOnlyElement(altTransition.apply(buildOptions, eventHandler).values()));
Iterables.getOnlyElement(altTransition.apply(buildOptions, eventHandler).values()),
eventHandler);
}
return activeOptions.getValue();
}
Expand All @@ -99,22 +99,41 @@ private static String prettyClassName(Class<?> clazz) {
}

/** Shows differences between two {@link BuildOptions} as debugging terminal output. */
private void compare(BuildOptions activeOptions, BuildOptions altOptions) {
private void compare(
BuildOptions fromOptions,
BuildOptions activeOptions,
BuildOptions altOptions,
EventHandler eventHandler) {
// Log fragments that only exist in one output.
SetView<Class<? extends FragmentOptions>> onlyInActive =
Sets.difference(activeOptions.getFragmentClasses(), altOptions.getFragmentClasses());
SetView<Class<? extends FragmentOptions>> onlyInAlt =
Sets.difference(altOptions.getFragmentClasses(), activeOptions.getFragmentClasses());
StringJoiner s = new StringJoiner("\n");
s.add("------------------------------------------");
s.add(String.format("ComparingTransition(%s, %s):", activeTransitionDesc, altTransitionDesc));
s.add(
String.format(
"Unique fragments in %s mode: %s",
"- from: %s, %s to: %s, %s to: %s",
fromOptions.shortId(),
activeTransitionDesc,
onlyInActive.stream().map(c -> prettyClassName(c)).collect(joining())));
activeOptions.shortId(),
altTransitionDesc,
altOptions.shortId()));
s.add(
String.format(
"Unique fragments in %s mode: %s",
altTransitionDesc, onlyInAlt.stream().map(c -> prettyClassName(c)).collect(joining())));
"- unique fragments in %s mode: %s",
activeTransitionDesc,
onlyInActive.isEmpty()
? "none"
: onlyInActive.stream().map(c -> prettyClassName(c)).collect(joining())));
s.add(
String.format(
"- unique fragments in %s mode: %s",
altTransitionDesc,
onlyInAlt.isEmpty()
? "none"
: onlyInAlt.stream().map(c -> prettyClassName(c)).collect(joining())));

ImmutableMap<String, String> activeMap = serialize(activeOptions);
ImmutableMap<String, String> altMap = serialize(altOptions);
Expand All @@ -141,27 +160,27 @@ private void compare(BuildOptions activeOptions, BuildOptions altOptions) {
String activeVal = combined.getValue().getFirst();
String altVal = combined.getValue().getSecond();
if (activeVal.equals("DOES NOT EXIST")) {
s2.add(String.format(" (only in %s mode): --%s=%s", activeTransitionDesc, option, altVal));
s2.add(String.format(" only in %s mode: --%s=%s", activeTransitionDesc, option, altVal));
diffs++;
} else if (altVal.equals("DOES NOT EXIST")) {
s2.add(String.format(" (only in %s mode): --%s=%s", altTransitionDesc, option, activeVal));
s2.add(String.format(" only in %s mode: --%s=%s", altTransitionDesc, option, activeVal));
diffs++;
} else if (!activeVal.equals(altVal)) {
s2.add(
String.format(
" --%s %s mode=%s %s mode=%s",
" --%s: %s mode=%s, %s mode=%s",
option, activeTransitionDesc, activeVal, altTransitionDesc, altVal));
diffs++;
}
}

// Summarize diff count both before and after the full diff for easy reading.
s.add(String.format("Total option differences: %d", diffs));
s.add(String.format("- total option differences: %d", diffs));
s.add(s2.toString());
if (diffs > 1) {
s.add(String.format("Total option differences: %d", diffs));
s.add(String.format("- total option differences: %d", diffs));
}
logger.atInfo().log("ComparingTransition: %s", s);
eventHandler.handle(Event.info(s.toString()));
}

/**
Expand Down

0 comments on commit 4e525df

Please sign in to comment.