aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java10
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);