Fix crash when a command-line aspect depends on a cycle.
PiperOrigin-RevId: 231246040
diff --git a/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java b/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
index 39c5fec..301774d 100644
--- a/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
+++ b/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
@@ -69,36 +69,41 @@
*/
public void reportCycles(
Iterable<CycleInfo> cycles, SkyKey topLevelKey, ExtendedEventHandler eventHandler) {
- Preconditions.checkNotNull(eventHandler);
+ Preconditions.checkNotNull(eventHandler, "topLevelKey: %s, Cycles %s", topLevelKey, cycles);
for (CycleInfo cycleInfo : cycles) {
- boolean alreadyReported = false;
- if (!cycleDeduper.seen(cycleInfo.getCycle())) {
- alreadyReported = true;
- }
- boolean successfullyReported = false;
- for (SingleCycleReporter cycleReporter : cycleReporters) {
- if (cycleReporter.maybeReportCycle(topLevelKey, cycleInfo, alreadyReported, eventHandler)) {
- successfullyReported = true;
- break;
- }
- }
- Preconditions.checkState(successfullyReported,
- printArbitraryCycle(topLevelKey, cycleInfo, alreadyReported));
+ maybeReportCycle(cycleInfo, topLevelKey, eventHandler);
}
}
- private String printArbitraryCycle(SkyKey topLevelKey, CycleInfo cycleInfo,
- boolean alreadyReported) {
- StringBuilder cycleMessage = new StringBuilder()
- .append("topLevelKey: " + topLevelKey + "\n")
- .append("alreadyReported: " + alreadyReported + "\n")
- .append("path to cycle:\n");
+ private void maybeReportCycle(
+ CycleInfo cycleInfo, SkyKey topLevelKey, ExtendedEventHandler eventHandler) {
+ boolean alreadyReported = !cycleDeduper.seen(cycleInfo.getCycle());
+ for (SingleCycleReporter cycleReporter : cycleReporters) {
+ if (cycleReporter.maybeReportCycle(topLevelKey, cycleInfo, alreadyReported, eventHandler)) {
+ return;
+ }
+ }
+ throw new IllegalStateException(
+ printArbitraryCycle(topLevelKey, cycleInfo, alreadyReported) + "\n" + cycleReporters);
+ }
+
+ private static String printArbitraryCycle(
+ SkyKey topLevelKey, CycleInfo cycleInfo, boolean alreadyReported) {
+ StringBuilder cycleMessage =
+ new StringBuilder()
+ .append("topLevelKey: ")
+ .append(topLevelKey)
+ .append("\n")
+ .append("alreadyReported: ")
+ .append(alreadyReported)
+ .append("\n")
+ .append("path to cycle:\n");
for (SkyKey skyKey : cycleInfo.getPathToCycle()) {
- cycleMessage.append(skyKey + "\n");
+ cycleMessage.append(skyKey).append("\n");
}
cycleMessage.append("cycle:\n");
for (SkyKey skyKey : cycleInfo.getCycle()) {
- cycleMessage.append(skyKey + "\n");
+ cycleMessage.append(skyKey).append("\n");
}
return cycleMessage.toString();
}