aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
diff options
context:
space:
mode:
authorGravatar Laurent Le Brun <laurentlb@google.com>2017-01-05 17:22:19 +0000
committerGravatar John Cater <jcater@google.com>2017-01-05 21:10:13 +0000
commit66bee178015781114f377e26de7a33d629f34f35 (patch)
tree4519b598551461d66d00526365fa03c3c0c91ba0 /src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
parent8741940d69de538cc4cf9b7296828cead5fc8621 (diff)
Fix cycle detection between .bzl files.
The code assumed that the last element before a cycle was a BUILD file. It can also be a .bzl file. -- PiperOrigin-RevId: 143673940 MOS_MIGRATED_REVID=143673940
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java34
1 files changed, 22 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
index d66bd57d4c..849fe1e413 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
@@ -19,6 +19,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.skyframe.CycleInfo;
@@ -63,23 +64,32 @@ public class SkylarkModuleCycleReporter implements CyclesReporter.SingleCycleRep
if (alreadyReported) {
return true;
} else if (Iterables.all(cycle, IS_SKYLARK_MODULE_SKY_KEY)
- // The last element of the path to the cycle has to be a PackageFunction.
- && IS_PACKAGE_SKY_KEY.apply(lastPathElement)) {
- StringBuilder cycleMessage =
- new StringBuilder()
- .append(lastPathElement.argument()).append("/BUILD: ")
- .append("cycle in referenced extension files: ");
+ // The last element before the cycle has to be a PackageFunction or SkylarkModule.
+ && (IS_PACKAGE_SKY_KEY.apply(lastPathElement)
+ || IS_SKYLARK_MODULE_SKY_KEY.apply(lastPathElement))) {
- AbstractLabelCycleReporter.printCycle(
- cycleInfo.getCycle(),
- cycleMessage,
+ Function printer =
new Function<SkyKey, String>() {
@Override
public String apply(SkyKey input) {
- return ((SkylarkImportLookupValue.SkylarkImportLookupKey) input.argument())
- .importLabel.toString();
+ if (input.argument() instanceof SkylarkImportLookupValue.SkylarkImportLookupKey) {
+ return ((SkylarkImportLookupValue.SkylarkImportLookupKey) input.argument())
+ .importLabel.toString();
+ } else if (input.argument() instanceof PackageIdentifier) {
+ return ((PackageIdentifier) input.argument()) + "/BUILD";
+ } else {
+ throw new UnsupportedOperationException();
+ }
}
- });
+ };
+
+ StringBuilder cycleMessage =
+ new StringBuilder()
+ .append("cycle detected in extension files: ")
+ .append("\n ")
+ .append(printer.apply(lastPathElement));
+
+ AbstractLabelCycleReporter.printCycle(cycleInfo.getCycle(), cycleMessage, printer);
// TODO(bazel-team): it would be nice to pass the Location of the load Statement in the
// BUILD file.
eventHandler.handle(Event.error(null, cycleMessage.toString()));