diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java index 9ac363df00..347cbf93e8 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java @@ -13,11 +13,12 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey; import com.google.devtools.build.lib.vfs.PathFragment; @@ -29,10 +30,11 @@ import java.util.Map; import javax.annotation.Nullable; /** - * <p>Computes {@link CollectPackagesUnderDirectoryValue} which describes whether the directory is a - * package and whether non-excluded packages exist below each of the directory's subdirectories. As - * a side effect, loads all of these packages, in order to interleave the disk-bound work of - * checking for directories and the CPU-bound work of package loading. + * Computes {@link CollectPackagesUnderDirectoryValue} which describes whether the directory is a + * package, or would have been a package but for a package loading error, and whether non-excluded + * packages (or errors) exist below each of the directory's subdirectories. As a side effect, loads + * all of these packages, in order to interleave the disk-bound work of checking for directories and + * the CPU-bound work of package loading. */ public class CollectPackagesUnderDirectoryFunction implements SkyFunction { private final BlazeDirectories directories; @@ -76,28 +78,32 @@ public class CollectPackagesUnderDirectoryFunction implements SkyFunction { RecursivePkgKey recursivePkgKey = (RecursivePkgKey) key.argument(); CollectPackagesUnderDirectoryValue collectPackagesValue = (CollectPackagesUnderDirectoryValue) subdirectorySkyValues.get(key); - boolean packagesInSubdirectory = collectPackagesValue.isDirectoryPackage(); - // If the subdirectory isn't a package, check to see if any of its subdirectories - // transitively contain packages. - if (!packagesInSubdirectory) { - ImmutableCollection<Boolean> subdirectoryValues = - collectPackagesValue.getSubdirectoryTransitivelyContainsPackages().values(); - for (Boolean pkgsInSubSub : subdirectoryValues) { - if (pkgsInSubSub) { - packagesInSubdirectory = true; - break; - } - } - } - builder.put(recursivePkgKey.getRootedPath(), packagesInSubdirectory); + + boolean packagesOrErrorsInSubdirectory = + collectPackagesValue.isDirectoryPackage() + || collectPackagesValue.getErrorMessage() != null + || Iterables.contains( + collectPackagesValue + .getSubdirectoryTransitivelyContainsPackagesOrErrors() + .values(), + Boolean.TRUE); + + builder.put(recursivePkgKey.getRootedPath(), packagesOrErrorsInSubdirectory); } - return CollectPackagesUnderDirectoryValue.of(visitor.isDirectoryPackage(), builder.build()); + ImmutableMap<RootedPath, Boolean> subdirectories = builder.build(); + String errorMessage = visitor.getErrorMessage(); + if (errorMessage != null) { + return CollectPackagesUnderDirectoryValue.ofError(errorMessage, subdirectories); + } + return CollectPackagesUnderDirectoryValue.ofNoError( + visitor.isDirectoryPackage(), subdirectories); } } private static class MyVisitor implements RecursiveDirectoryTraversalFunction.Visitor { private boolean isDirectoryPackage; + @Nullable private String errorMessage; private MyVisitor() {} @@ -106,9 +112,20 @@ public class CollectPackagesUnderDirectoryFunction implements SkyFunction { isDirectoryPackage = true; } + @Override + public void visitPackageError(NoSuchPackageException e, Environment env) + throws InterruptedException { + errorMessage = e.getMessage(); + } + boolean isDirectoryPackage() { return isDirectoryPackage; } + + @Nullable + String getErrorMessage() { + return errorMessage; + } } @Nullable |