Add .bazelignore content to blacklisted subdirectories in cquery and aquery's
QueryEnvironment.
Fixes #7229.
Context: ConfiguredTargetQueryEnvironment and ActionGraphQueryEnvironment were not taking into account the content of .bazelignore file when getTargetsMatchingPattern. This caused a precondition check for recursive pkg lookup in RecursivePkgValueRootPackageExtractor to fail.
Changes:
- Get the blacklisted PathFragments from .bazelignore from the walkableGraph.
- Rm checkAllPathsAreUnder checks in GraphBackedRecursivePackageProvider, in the same manner it's handled in EnvironmentBackedRecursivePackageProvider.
RELNOTES: None
PiperOrigin-RevId: 240270920
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java
index 998c36d..b6651c9 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/RecursivePackageProvider.java
@@ -37,11 +37,10 @@
* @param eventHandler any errors emitted during package lookup and loading for {@code directory}
* and non-excluded directories beneath it will be reported here
* @param directory a {@link RootedPath} specifying the directory to search
- * @param blacklistedSubdirectories a set of {@link PathFragment}s, all of which are beneath
- * {@code directory} (not necessarily strictly), specifying transitive subdirectories that
- * have been blacklisted
- * @param excludedSubdirectories a set of {@link PathFragment}s, all of which are beneath {@code
- * directory} (not necessarily strictly), specifying transitive subdirectories to exclude
+ * @param blacklistedSubdirectories a set of {@link PathFragment}s specifying transitive
+ * subdirectories that have been blacklisted
+ * @param excludedSubdirectories a set of {@link PathFragment}s specifying transitive
+ * subdirectories to exclude
*/
Iterable<PathFragment> getPackagesUnderDirectory(
ExtendedEventHandler eventHandler,
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java
index 464df93..68ff864 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ActionGraphQueryEnvironment.java
@@ -280,33 +280,38 @@
}
return immediateSuccessfulFuture(null);
}
+
AsyncFunction<TargetParsingException, Void> reportBuildFileErrorAsyncFunction =
exn -> {
reportBuildFileError(owner, exn.getMessage());
return Futures.immediateFuture(null);
};
- return QueryTaskFutureImpl.ofDelegate(
- Futures.catchingAsync(
- patternToEval.evalAdaptedForAsync(
- resolver,
- ImmutableSet.of(),
- ImmutableSet.of(),
- (Callback<Target>)
- partialResult -> {
- List<ConfiguredTargetValue> transformedResult = new ArrayList<>();
- for (Target target : partialResult) {
- ConfiguredTargetValue configuredTargetValue =
- getConfiguredTargetValue(target.getLabel());
- if (configuredTargetValue != null) {
- transformedResult.add(configuredTargetValue);
+ try {
+ return QueryTaskFutureImpl.ofDelegate(
+ Futures.catchingAsync(
+ patternToEval.evalAdaptedForAsync(
+ resolver,
+ getBlacklistedPackagePrefixesPathFragments(),
+ /* excludedSubdirectories= */ ImmutableSet.of(),
+ (Callback<Target>)
+ partialResult -> {
+ List<ConfiguredTargetValue> transformedResult = new ArrayList<>();
+ for (Target target : partialResult) {
+ ConfiguredTargetValue configuredTargetValue =
+ getConfiguredTargetValue(target.getLabel());
+ if (configuredTargetValue != null) {
+ transformedResult.add(configuredTargetValue);
+ }
}
- }
- callback.process(transformedResult);
- },
- QueryException.class),
- TargetParsingException.class,
- reportBuildFileErrorAsyncFunction,
- MoreExecutors.directExecutor()));
+ callback.process(transformedResult);
+ },
+ QueryException.class),
+ TargetParsingException.class,
+ reportBuildFileErrorAsyncFunction,
+ MoreExecutors.directExecutor()));
+ } catch (InterruptedException e) {
+ return immediateCancelledFuture();
+ }
}
private ConfiguredTargetValue getConfiguredTargetValue(Label label) throws InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java
index 231f0df..e41357d 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java
@@ -225,27 +225,33 @@
reportBuildFileError(owner, exn.getMessage());
return Futures.immediateFuture(null);
};
- return QueryTaskFutureImpl.ofDelegate(
- Futures.catchingAsync(
- patternToEval.evalAdaptedForAsync(
- resolver,
- ImmutableSet.of(),
- ImmutableSet.of(),
- (Callback<Target>)
- partialResult -> {
- List<ConfiguredTarget> transformedResult = new ArrayList<>();
- for (Target target : partialResult) {
- ConfiguredTarget configuredTarget = getConfiguredTarget(target.getLabel());
- if (configuredTarget != null) {
- transformedResult.add(configuredTarget);
+
+ try {
+ return QueryTaskFutureImpl.ofDelegate(
+ Futures.catchingAsync(
+ patternToEval.evalAdaptedForAsync(
+ resolver,
+ getBlacklistedPackagePrefixesPathFragments(),
+ /* excludedSubdirectories= */ ImmutableSet.of(),
+ (Callback<Target>)
+ partialResult -> {
+ List<ConfiguredTarget> transformedResult = new ArrayList<>();
+ for (Target target : partialResult) {
+ ConfiguredTarget configuredTarget =
+ getConfiguredTarget(target.getLabel());
+ if (configuredTarget != null) {
+ transformedResult.add(configuredTarget);
+ }
}
- }
- callback.process(transformedResult);
- },
- QueryException.class),
- TargetParsingException.class,
- reportBuildFileErrorAsyncFunction,
- MoreExecutors.directExecutor()));
+ callback.process(transformedResult);
+ },
+ QueryException.class),
+ TargetParsingException.class,
+ reportBuildFileErrorAsyncFunction,
+ MoreExecutors.directExecutor()));
+ } catch (InterruptedException e) {
+ return immediateCancelledFuture();
+ }
}
private ConfiguredTarget getConfiguredTarget(Label label) throws InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
index 044db34..c193b1a 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/PostAnalysisQueryEnvironment.java
@@ -53,6 +53,7 @@
import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback;
import com.google.devtools.build.lib.query2.engine.Uniquifier;
import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
+import com.google.devtools.build.lib.skyframe.BlacklistedPackagePrefixesValue;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetValue;
import com.google.devtools.build.lib.skyframe.GraphBackedRecursivePackageProvider;
@@ -63,6 +64,7 @@
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import com.google.devtools.build.lib.skyframe.TargetPatternValue;
import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey;
+import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.WalkableGraph;
import java.io.IOException;
@@ -226,6 +228,13 @@
return (ConfiguredTargetValue) walkableGraphSupplier.get().getValue(key);
}
+ ImmutableSet<PathFragment> getBlacklistedPackagePrefixesPathFragments()
+ throws InterruptedException {
+ return ((BlacklistedPackagePrefixesValue)
+ walkableGraphSupplier.get().getValue(BlacklistedPackagePrefixesValue.key()))
+ .getPatterns();
+ }
+
@Nullable
protected abstract T getValueFromKey(SkyKey key) throws InterruptedException;
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 1c4daf4..8e10e71 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
@@ -162,7 +162,7 @@
if (blacklistedSubdirectories.contains(directory)) {
return ImmutableList.of();
}
- ImmutableSet filteredBlacklistedSubdirectories =
+ ImmutableSet<PathFragment> filteredBlacklistedSubdirectories =
ImmutableSet.copyOf(
Iterables.filter(
blacklistedSubdirectories,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
index 2c3ebca..8c82a17 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java
@@ -174,9 +174,6 @@
return ImmutableList.of();
}
- PathFragment.checkAllPathsAreUnder(blacklistedSubdirectories, directory);
- PathFragment.checkAllPathsAreUnder(excludedSubdirectories, directory);
-
// Check that this package is covered by at least one of our universe patterns.
boolean inUniverse = false;
for (TargetPatternKey patternKey : universeTargetPatternKeys) {
@@ -220,6 +217,7 @@
List<Root> roots =
checkValidDirectoryAndGetRoots(
repository, directory, blacklistedSubdirectories, excludedSubdirectories);
+
return rootPackageExtractor.getPackagesFromRoots(
graph,
roots,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
index 3adda7e..df3e53e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
@@ -37,6 +37,13 @@
ImmutableSet<PathFragment> blacklistedSubdirectories,
ImmutableSet<PathFragment> excludedSubdirectories)
throws InterruptedException {
+
+ ImmutableSet filteredBlacklistedSubdirectories =
+ ImmutableSet.copyOf(
+ Iterables.filter(
+ blacklistedSubdirectories,
+ path -> !path.equals(directory) && path.startsWith(directory)));
+
LinkedHashSet<PathFragment> packageNames = new LinkedHashSet<>();
for (Root root : roots) {
// Note: no need to check if lookup == null because it will never be null.
@@ -48,7 +55,7 @@
RecursivePkgValue.key(
repository,
RootedPath.toRootedPath(root, directory),
- blacklistedSubdirectories));
+ filteredBlacklistedSubdirectories));
Preconditions.checkState(
lookup != null,
"Root %s in repository %s could not be found in the graph.",
diff --git a/src/test/shell/bazel/bazelignore_test.sh b/src/test/shell/bazel/bazelignore_test.sh
index 3f91685..abd575b 100755
--- a/src/test/shell/bazel/bazelignore_test.sh
+++ b/src/test/shell/bazel/bazelignore_test.sh
@@ -73,4 +73,35 @@
bazel build //foo/bar/... || fail "Could not build valid target"
}
+test_aquery_specific_target() {
+ rm -rf work && mkdir work && cd work
+ touch WORKSPACE
+ mkdir -p foo/ignoreme
+ cat > foo/ignoreme/BUILD <<'EOI'
+genrule(
+ name = "ignoreme",
+ outs = ["ignore.txt"],
+ cmd = "echo Hello World > $@",
+)
+EOI
+ mkdir -p foo
+ cat > foo/BUILD <<'EOI'
+genrule(
+ name = "out",
+ outs = ["out.txt"],
+ cmd = "echo Hello World > $@",
+)
+EOI
+ bazel aquery ... > output 2> "$TEST_log" \
+ || fail "Aquery should complete without error."
+ cat output >> "$TEST_log"
+ assert_contains "ignoreme" output
+
+ echo foo/ignoreme > .bazelignore
+ bazel aquery ... > output 2> "$TEST_log" \
+ || fail "Aquery should complete without error."
+ cat output >> "$TEST_log"
+ assert_not_contains "ignoreme" output
+}
+
run_suite "Integration tests for .bazelignore"