Failures early in package loading will now fail all --keep_going builds.
When loading all packages under a directory (//foo/...) we use RecursivePkgFunction,
which in --keep_going mode was silently ignoring any NoSuchPackageExceptions thrown
by PackageFunction. Critically, any exceptions thrown by loading a Starlark .bzl file
were being ignored during loading.
RecursivePkgFunction now transitively collects presence of errors into the
RecursivePkgValue so callers (EnvironmentBackedRecursivePackageProvider)
can observe and record that errors happened during loading.
Fixes #7674.
RELNOTES:
None.
PiperOrigin-RevId: 251298005
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
index d864c02..0fd722f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java
@@ -37,19 +37,21 @@
public class RecursivePkgValue implements SkyValue {
@AutoCodec
static final RecursivePkgValue EMPTY =
- new RecursivePkgValue(NestedSetBuilder.<String>emptySet(Order.STABLE_ORDER));
+ new RecursivePkgValue(NestedSetBuilder.<String>emptySet(Order.STABLE_ORDER), false);
private final NestedSet<String> packages;
+ private final boolean hasErrors;
- private RecursivePkgValue(NestedSet<String> packages) {
+ private RecursivePkgValue(NestedSet<String> packages, boolean hasErrors) {
this.packages = packages;
+ this.hasErrors = hasErrors;
}
- static RecursivePkgValue create(NestedSetBuilder<String> packages) {
- if (packages.isEmpty()) {
+ static RecursivePkgValue create(NestedSetBuilder<String> packages, boolean hasErrors) {
+ if (packages.isEmpty() && !hasErrors) {
return EMPTY;
}
- return new RecursivePkgValue(packages.build());
+ return new RecursivePkgValue(packages.build(), hasErrors);
}
/** Create a transitive package lookup request. */
@@ -65,6 +67,10 @@
return packages;
}
+ public boolean hasErrors() {
+ return hasErrors;
+ }
+
@AutoCodec.VisibleForSerialization
@AutoCodec
static class Key extends RecursivePkgSkyKey {