Consider pkg in error on any symlink cycle in deps
While evaluating a package value, whether the package should be in
error was checked several times for different kinds of symlink cycle
deps: subincluded target's package, subincluded target, and glob.
But each check overrode the result of previous checks. Now, the
error state is a big OR of the results of each cycle check, not just
the last one (which happened to be for globs).
--
MOS_MIGRATED_REVID=95854169
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 8aac499..121e114 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -218,7 +218,8 @@
private static boolean markDependenciesAndPropagateInconsistentFilesystemExceptions(
Package pkg, Environment env, Collection<Pair<String, Boolean>> globPatterns,
Map<Label, Path> subincludes) throws InternalInconsistentFilesystemException {
- boolean packageShouldBeInError = pkg.containsErrors();
+ boolean packageWasOriginallyInError = pkg.containsErrors();
+ boolean packageShouldBeInError = packageWasOriginallyInError;
// TODO(bazel-team): This means that many packages will have to be preprocessed twice. Ouch!
// We need a better continuation mechanism to avoid repeating work. [skyframe-loading]
@@ -234,10 +235,10 @@
}
Pair<? extends Map<PathFragment, PackageLookupValue>, Boolean> subincludePackageLookupResult =
getPackageLookupDepsAndPropagateInconsistentFilesystemExceptions(pkg.getName(),
- subincludePackageLookupDepKeys, env, pkg.containsErrors());
+ subincludePackageLookupDepKeys, env, packageWasOriginallyInError);
Map<PathFragment, PackageLookupValue> subincludePackageLookupDeps =
subincludePackageLookupResult.getFirst();
- packageShouldBeInError = subincludePackageLookupResult.getSecond();
+ packageShouldBeInError |= subincludePackageLookupResult.getSecond();
List<SkyKey> subincludeFileDepKeys = Lists.newArrayList();
for (Entry<Label, Path> subincludeEntry : subincludes.entrySet()) {
// Ideally, we would have a direct dependency on the target with the given label, but then
@@ -273,8 +274,8 @@
}
}
}
- packageShouldBeInError = markFileDepsAndPropagateInconsistentFilesystemExceptions(
- pkg.getName(), subincludeFileDepKeys, env, pkg.containsErrors());
+ packageShouldBeInError |= markFileDepsAndPropagateInconsistentFilesystemExceptions(
+ pkg.getName(), subincludeFileDepKeys, env, packageWasOriginallyInError);
// TODO(bazel-team): In the long term, we want to actually resolve the glob patterns within
// Skyframe. For now, just logging the glob requests provides correct incrementality and
@@ -293,8 +294,8 @@
}
globDepKeys.add(globSkyKey);
}
- packageShouldBeInError = markGlobDepsAndPropagateInconsistentFilesystemExceptions(
- pkg.getName(), globDepKeys, env, pkg.containsErrors());
+ packageShouldBeInError |= markGlobDepsAndPropagateInconsistentFilesystemExceptions(
+ pkg.getName(), globDepKeys, env, packageWasOriginallyInError);
return packageShouldBeInError;
}
@@ -480,7 +481,7 @@
Map<Label, Path> subincludes = legacyPkgBuilder.getSubincludes();
Package pkg = legacyPkgBuilder.finishBuild();
Event.replayEventsOn(env.getListener(), pkg.getEvents());
- boolean packageShouldBeConsideredInError = pkg.containsErrors();
+ boolean packageShouldBeConsideredInError;
try {
packageShouldBeConsideredInError =
markDependenciesAndPropagateInconsistentFilesystemExceptions(pkg, env,