diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java index e81858e93e..34ab492120 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java @@ -19,6 +19,7 @@ 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.cmdline.PackageIdentifier.RepositoryName; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; @@ -26,12 +27,17 @@ import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.Target; +import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.pkgcache.RecursivePackageProvider; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction.Environment; import com.google.devtools.build.skyframe.SkyKey; +import java.util.ArrayList; +import java.util.List; + /** * A {@link RecursivePackageProvider} backed by an {@link Environment}. Its methods * may throw {@link MissingDepException} if the package values this depends on haven't been @@ -91,26 +97,48 @@ public final class EnvironmentBackedRecursivePackageProvider implements Recursiv @Override public Iterable<PathFragment> getPackagesUnderDirectory( - RepositoryName repository, RootedPath directory, + RepositoryName repository, PathFragment directory, ImmutableSet<PathFragment> excludedSubdirectories) throws MissingDepException { - PathFragment rootedPathFragment = directory.getRelativePath(); - PathFragment.checkAllPathsAreUnder(excludedSubdirectories, rootedPathFragment); - RecursivePkgValue lookup = (RecursivePkgValue) env.getValue( - RecursivePkgValue.key(repository, directory, excludedSubdirectories)); - if (lookup == null) { - // Typically a null value from Environment.getValue(k) means that either the key k is missing - // a dependency or an exception was thrown during evaluation of k. Here, if this getValue - // call returns null in a keep_going build, it can only mean a missing dependency, because - // RecursivePkgFunction#compute never throws. - // In a nokeep_going build, a lower-level exception that RecursivePkgFunction ignored may - // bubble up to here, but we ignore it and depend on the top-level caller to be flexible in - // the exception types it can accept. + PathPackageLocator packageLocator = PrecomputedValue.PATH_PACKAGE_LOCATOR.get(env); + if (packageLocator == null) { throw new MissingDepException(); } + + List<Path> roots = new ArrayList<>(); + if (repository.isDefault()) { + roots.addAll(packageLocator.getPathEntries()); + } else { + RepositoryValue repositoryValue = + (RepositoryValue) env.getValue(RepositoryValue.key(repository)); + if (repositoryValue == null) { + throw new MissingDepException(); + } + + roots.add(repositoryValue.getPath()); + } + + NestedSetBuilder<String> packageNames = NestedSetBuilder.stableOrder(); + for (Path root : roots) { + PathFragment.checkAllPathsAreUnder(excludedSubdirectories, directory); + RecursivePkgValue lookup = (RecursivePkgValue) env.getValue(RecursivePkgValue.key( + repository, RootedPath.toRootedPath(root, directory), excludedSubdirectories)); + if (lookup == null) { + // Typically a null value from Environment.getValue(k) means that either the key k is + // missing a dependency or an exception was thrown during evaluation of k. Here, if this + // getValue call returns null in a keep_going build, it can only mean a missing dependency + // because RecursivePkgFunction#compute never throws. + // In a nokeep_going build, a lower-level exception that RecursivePkgFunction ignored may + // bubble up to here, but we ignore it and depend on the top-level caller to be flexible in + // the exception types it can accept. + throw new MissingDepException(); + } + + packageNames.addTransitive(lookup.getPackages()); + } // TODO(bazel-team): Make RecursivePkgValue return NestedSet<PathFragment> so this transform is // unnecessary. - return Iterables.transform(lookup.getPackages(), PathFragment.TO_PATH_FRAGMENT); + return Iterables.transform(packageNames.build(), PathFragment.TO_PATH_FRAGMENT); } @Override |