diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
4 files changed, 33 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java index 903d99e687..3a4f7d66d9 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java @@ -73,6 +73,18 @@ public class PackageLookupFunction implements SkyFunction { return PackageLookupValue.DELETED_PACKAGE_VALUE; } + ImmutableSet<PathFragment> patterns = PrecomputedValue.BLACKLISTED_PKG_PREFIXES.get(env); + if (patterns == null) { + return null; + } + + PathFragment buildFileFragment = packageKey.getPackageFragment(); + for (PathFragment pattern : patterns) { + if (buildFileFragment.startsWith(pattern)) { + return PackageLookupValue.DELETED_PACKAGE_VALUE; + } + } + // TODO(bazel-team): The following is O(n^2) on the number of elements on the package path due // to having restart the SkyFunction after every new dependency. However, if we try to batch // the missing value keys, more dependencies than necessary will be declared. This wart can be diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java index 6fb102843f..518b538065 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java @@ -19,6 +19,7 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.TopLevelArtifactContext; @@ -28,6 +29,7 @@ import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildIn import com.google.devtools.build.lib.packages.RuleVisibility; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ConflictException; +import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.Injectable; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyKey; @@ -75,6 +77,9 @@ public final class PrecomputedValue implements SkyValue { public static final Precomputed<String> DEFAULTS_PACKAGE_CONTENTS = new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "default_pkg")); + public static final Precomputed<ImmutableSet<PathFragment>> BLACKLISTED_PKG_PREFIXES = + new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "blacklisted_pkg_patterns")); + public static final Precomputed<RuleVisibility> DEFAULT_VISIBILITY = new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "default_visibility")); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java index f55de62252..3286908da0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java @@ -17,6 +17,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName; import com.google.devtools.build.lib.events.Event; @@ -112,7 +113,11 @@ abstract class RecursiveDirectoryTraversalFunction */ TReturn visitDirectory(RecursivePkgKey recursivePkgKey, Environment env) { RootedPath rootedPath = recursivePkgKey.getRootedPath(); - Set<PathFragment> excludedPaths = recursivePkgKey.getExcludedPaths(); + ImmutableSet<PathFragment> blacklist = PrecomputedValue.BLACKLISTED_PKG_PREFIXES.get(env); + if (blacklist == null) { + return null; + } + Set<PathFragment> excludedPaths = Sets.union(recursivePkgKey.getExcludedPaths(), blacklist); Path root = rootedPath.getRoot(); PathFragment rootRelativePath = rootedPath.getRelativePath(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 631fc2f599..28ac669e66 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -500,6 +500,10 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { } } + protected ImmutableSet<PathFragment> getBlacklistedPkgPrefixes() { + return ImmutableSet.of(); + } + class BuildViewProvider { /** * Returns the current {@link SkyframeBuildView} instance. @@ -868,6 +872,11 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { @VisibleForTesting // productionVisibility = Visibility.PRIVATE public abstract void setDeletedPackages(Iterable<PackageIdentifier> pkgs); + @VisibleForTesting + public final void setBlacklistedPkgPrefixes(ImmutableSet<PathFragment> blacklist) { + PrecomputedValue.BLACKLISTED_PKG_PREFIXES.set(injectable(), blacklist); + } + /** * Prepares the evaluator for loading. * @@ -882,6 +891,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { maybeInjectPrecomputedValuesForAnalysis(); setCommandId(commandId); + setBlacklistedPkgPrefixes(getBlacklistedPkgPrefixes()); setShowLoadingProgress(showLoadingProgress); setDefaultVisibility(defaultVisibility); setupDefaultPackage(defaultsPackageContents); |