diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java index bac46b6f9314dd..6ea3f7e21786d1 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java @@ -16,12 +16,12 @@ import com.github.difflib.patch.PatchFailedException; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.devtools.build.docgen.annot.DocCategory; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.bazel.debug.WorkspaceRuleEvent; import com.google.devtools.build.lib.bazel.repository.PatchUtil; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.packages.Attribute; @@ -78,7 +78,7 @@ public class StarlarkRepositoryContext extends StarlarkBaseExternalContext { private final Rule rule; private final PathPackageLocator packageLocator; private final StructImpl attrObject; - private final ImmutableSet ignoredPatterns; + private final IgnoredSubdirectories ignoredSubdirectories; private final SyscallCache syscallCache; private final HashMap recordedDirTreeInputs = new HashMap<>(); @@ -90,7 +90,7 @@ public class StarlarkRepositoryContext extends StarlarkBaseExternalContext { Rule rule, PathPackageLocator packageLocator, Path outputDirectory, - ImmutableSet ignoredPatterns, + IgnoredSubdirectories ignoredSubdirectories, Environment environment, ImmutableMap env, DownloadManager downloadManager, @@ -116,7 +116,7 @@ public class StarlarkRepositoryContext extends StarlarkBaseExternalContext { /* allowWatchingPathsOutsideWorkspace= */ true); this.rule = rule; this.packageLocator = packageLocator; - this.ignoredPatterns = ignoredPatterns; + this.ignoredSubdirectories = ignoredSubdirectories; this.syscallCache = syscallCache; WorkspaceAttributeMapper attrs = WorkspaceAttributeMapper.of(rule); ImmutableMap.Builder attrBuilder = new ImmutableMap.Builder<>(); @@ -177,10 +177,8 @@ private StarlarkPath externalPath(String method, Object pathObject) } Path workspaceRoot = packageLocator.getWorkspaceFile(syscallCache).getParentDirectory(); PathFragment relativePath = path.relativeTo(workspaceRoot); - for (PathFragment ignoredPattern : ignoredPatterns) { - if (relativePath.startsWith(ignoredPattern)) { - return starlarkPath; - } + if (ignoredSubdirectories.matchingEntry(relativePath) != null) { + return starlarkPath; } throw Starlark.errorf( "%s can only be applied to external paths (that is, outside the workspace or ignored in" diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java index 967afd079e3a76..2f9dabccae9b36 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride; import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.cmdline.RepositoryMapping; @@ -52,7 +53,6 @@ import com.google.devtools.build.lib.skyframe.RepositoryMappingValue; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.SyscallCache; import com.google.devtools.build.skyframe.SkyFunction.Environment; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; @@ -222,7 +222,8 @@ private FetchResult fetchInternal( if (env.valuesMissing()) { return null; } - ImmutableSet ignoredPatterns = checkNotNull(ignoredPackagesValue).getPatterns(); + IgnoredSubdirectories ignoredSubdirectories = + checkNotNull(ignoredPackagesValue).asIgnoredSubdirectories(); Map recordedInputValues = new LinkedHashMap<>(); try (Mutability mu = Mutability.create("Starlark repository"); @@ -231,7 +232,7 @@ private FetchResult fetchInternal( rule, packageLocator, outputDirectory, - ignoredPatterns, + ignoredSubdirectories, env, ImmutableMap.copyOf(clientEnvironment), downloadManager, diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java b/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java index f8870c021cea9e..9d970aff0bb726 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/SymlinkForest.java @@ -23,6 +23,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.flogger.GoogleLogger; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; @@ -387,7 +388,7 @@ public static ImmutableSet eagerlyPlantSymlinkForestSinglePackagePath( Path execroot, Path sourceRoot, String prefix, - ImmutableSet ignoredPaths, + IgnoredSubdirectories ignoredPaths, boolean siblingRepositoryLayout) throws IOException { deleteTreesBelowNotPrefixed(execroot, prefix); @@ -424,19 +425,19 @@ public static ImmutableSet eagerlyPlantSymlinkForestSinglePackagePath( static boolean symlinkShouldBePlanted( String prefix, boolean siblingRepositoryLayout, String baseName, Path target) { return symlinkShouldBePlanted( - prefix, ImmutableSet.of(), siblingRepositoryLayout, baseName, target); + prefix, IgnoredSubdirectories.EMPTY, siblingRepositoryLayout, baseName, target); } public static boolean symlinkShouldBePlanted( String prefix, - ImmutableSet ignoredPaths, + IgnoredSubdirectories ignoredSubdirectories, boolean siblingRepositoryLayout, String baseName, Path target) { // Create any links that don't start with bazel-, and ignore external/ directory if // user has it in the source tree because it conflicts with external repository location. return !baseName.startsWith(prefix) - && !ignoredPaths.contains(target) + && ignoredSubdirectories.matchingEntry(target.asFragment().toRelative()) == null && (siblingRepositoryLayout || !baseName.equals(LabelConstants.EXTERNAL_PATH_PREFIX.getBaseName())); } diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD index c0b55a929af604..00d4764187ff85 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD @@ -17,6 +17,7 @@ java_library( srcs = [ "BazelCompileContext.java", "BazelModuleContext.java", + "IgnoredSubdirectories.java", "Label.java", "LabelConstants.java", "LabelParser.java", diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/IgnoredSubdirectories.java b/src/main/java/com/google/devtools/build/lib/cmdline/IgnoredSubdirectories.java new file mode 100644 index 00000000000000..356251845662b2 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/cmdline/IgnoredSubdirectories.java @@ -0,0 +1,127 @@ +// Copyright 2024 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.cmdline; + +import static com.google.common.collect.ImmutableSet.toImmutableSet; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.vfs.PathFragment; +import java.util.Objects; +import javax.annotation.Nullable; + +/** + * A set of subdirectories to ignore during target pattern matching or globbing. + * + *

This is currently just a prefix, but will eventually support glob-style wildcards. + */ +public final class IgnoredSubdirectories { + public static final IgnoredSubdirectories EMPTY = new IgnoredSubdirectories(ImmutableSet.of()); + + private final ImmutableSet prefixes; + + private IgnoredSubdirectories(ImmutableSet prefixes) { + for (PathFragment prefix : prefixes) { + Preconditions.checkArgument(!prefix.isAbsolute()); + } + this.prefixes = prefixes; + } + + public static IgnoredSubdirectories of(ImmutableSet prefixes) { + if (prefixes.isEmpty()) { + return EMPTY; + } else { + return new IgnoredSubdirectories(prefixes); + } + } + + public IgnoredSubdirectories withPrefix(PathFragment prefix) { + ImmutableSet prefixed = + prefixes.stream().map(prefix::getRelative).collect(toImmutableSet()); + return new IgnoredSubdirectories(prefixed); + } + + public IgnoredSubdirectories union(IgnoredSubdirectories other) { + return new IgnoredSubdirectories( + ImmutableSet.builder().addAll(prefixes).addAll(other.prefixes).build()); + } + + /** Filters out entries that cannot match anything under {@code directory}. */ + public IgnoredSubdirectories filterForDirectory(PathFragment directory) { + ImmutableSet filteredPrefixes = + prefixes.stream().filter(p -> p.startsWith(directory)).collect(toImmutableSet()); + + return new IgnoredSubdirectories(filteredPrefixes); + } + + public ImmutableSet prefixes() { + return prefixes; + } + + public boolean isEmpty() { + return this.prefixes.isEmpty(); + } + + /** + * Checks whether every path in this instance can conceivably match something under {@code + * directory}. + */ + public boolean allPathsAreUnder(PathFragment directory) { + for (PathFragment prefix : prefixes) { + if (!prefix.startsWith(directory)) { + return false; + } + + if (prefix.equals(directory)) { + return false; + } + } + + return true; + } + + /** Returns the entry that matches a given directory or {@code null} if none. */ + @Nullable + public PathFragment matchingEntry(PathFragment directory) { + for (PathFragment prefix : prefixes) { + if (directory.startsWith(prefix)) { + return prefix; + } + } + + return null; + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof IgnoredSubdirectories)) { + return false; + } + + IgnoredSubdirectories that = (IgnoredSubdirectories) other; + return Objects.equals(this.prefixes, that.prefixes); + } + + @Override + public int hashCode() { + return prefixes.hashCode(); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper("IgnoredSubdirectories").add("prefixes", prefixes).toString(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java index d9886b3d60579d..e1ff3593701309 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java @@ -152,11 +152,14 @@ public String getOriginalPattern() { */ public abstract void eval( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) - throws TargetParsingException, E, InterruptedException, ProcessPackageDirectoryException, + throws TargetParsingException, + E, + InterruptedException, + ProcessPackageDirectoryException, InconsistentFilesystemException; /** @@ -173,7 +176,7 @@ public abstract void ev public final ListenableFuture evalAdaptedForAsync( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) { @@ -206,7 +209,7 @@ ListenableFuture evalAdaptedForAsync( */ public ListenableFuture evalAsync( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass, @@ -276,7 +279,7 @@ static final class SingleTarget extends TargetPattern { @Override public void eval( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) @@ -345,7 +348,7 @@ static final class InterpretPathAsTarget extends TargetPattern { @Override public void eval( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) @@ -448,7 +451,7 @@ static final class TargetsInPackage extends TargetPattern { @Override public void eval( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) @@ -581,7 +584,7 @@ public static final class TargetsBelowDirectory extends TargetPattern { @Override public void eval( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectoriesSupplier, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) @@ -591,17 +594,22 @@ public void eval( "Fully excluded target pattern %s should have already been filtered out (%s)", this, excludedSubdirectories); - IgnoredPathFragmentsInScopeOrFilteringIgnorer ignoredIntersection = - getAllIgnoredSubdirectoriesToExclude(ignoredSubdirectories); - if (warnIfFiltered(ignoredIntersection, resolver)) { + IgnoredSubdirectories ignoredSubdirectories = ignoredSubdirectoriesSupplier.get(); + PathFragment matchingEntry = + ignoredSubdirectories.matchingEntry(directory.getPackageFragment()); + if (warnIfFiltered(matchingEntry, resolver)) { return; } + + IgnoredSubdirectories filteredIgnoredSubdirectories = + ignoredSubdirectories.filterForDirectory(directory.getPackageFragment()); + resolver.findTargetsBeneathDirectory( directory.getRepository(), getOriginalPattern(), directory.getPackageFragment().getPathString(), rulesOnly, - ignoredIntersection.ignoredPathFragments(), + filteredIgnoredSubdirectories, excludedSubdirectories, callback, exceptionClass); @@ -611,7 +619,7 @@ public void eval( public ListenableFuture evalAsync( TargetPatternResolver resolver, - InterruptibleSupplier> ignoredSubdirectories, + InterruptibleSupplier ignoredSubdirectoriesSupplier, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass, @@ -621,133 +629,44 @@ ListenableFuture evalAsync( "Fully excluded target pattern %s should have already been filtered out (%s)", this, excludedSubdirectories); - IgnoredPathFragmentsInScopeOrFilteringIgnorer ignoredIntersection; + IgnoredSubdirectories filteredIgnoredSubdirectories; try { - ignoredIntersection = getAllIgnoredSubdirectoriesToExclude(ignoredSubdirectories); + IgnoredSubdirectories ignoredSubdirectories = ignoredSubdirectoriesSupplier.get(); + PathFragment matchingEntry = + ignoredSubdirectories.matchingEntry(directory.getPackageFragment()); + if (warnIfFiltered(matchingEntry, resolver)) { + return immediateVoidFuture(); + } + filteredIgnoredSubdirectories = + ignoredSubdirectories.filterForDirectory(directory.getPackageFragment()); } catch (InterruptedException e) { return immediateCancelledFuture(); } - if (warnIfFiltered(ignoredIntersection, resolver)) { - return immediateVoidFuture(); - } return resolver.findTargetsBeneathDirectoryAsync( directory.getRepository(), getOriginalPattern(), directory.getPackageFragment().getPathString(), rulesOnly, - ignoredIntersection.ignoredPathFragments(), + filteredIgnoredSubdirectories, excludedSubdirectories, callback, exceptionClass, executor); } - private boolean warnIfFiltered( - IgnoredPathFragmentsInScopeOrFilteringIgnorer ignoredIntersection, - TargetPatternResolver resolver) { - if (ignoredIntersection.wasFiltered()) { + private boolean warnIfFiltered(PathFragment matchingEntry, TargetPatternResolver resolver) { + if (matchingEntry != null) { resolver.warn( "Pattern '" + getOriginalPattern() + "' was filtered out by ignored directory '" - + ignoredIntersection.filteringIgnorer().getPathString() + + matchingEntry + "'"); return true; } return false; } - public IgnoredPathFragmentsInScopeOrFilteringIgnorer getAllIgnoredSubdirectoriesToExclude( - InterruptibleSupplier> ignoredPackagePrefixes) - throws InterruptedException { - ImmutableSet.Builder ignoredPathsBuilder = - ImmutableSet.builderWithExpectedSize(0); - for (PathFragment ignoredPackagePrefix : ignoredPackagePrefixes.get()) { - if (this.containedIn(ignoredPackagePrefix)) { - return new IgnoredPathFragmentsInScopeOrFilteringIgnorer.FilteringIgnorer( - ignoredPackagePrefix); - } - PackageIdentifier pkgIdForIgnoredDirectorPrefix = - PackageIdentifier.create(directory.getRepository(), ignoredPackagePrefix); - if (this.containsAllTransitiveSubdirectories(pkgIdForIgnoredDirectorPrefix)) { - ignoredPathsBuilder.add(ignoredPackagePrefix); - } - } - return IgnoredPathFragmentsInScopeOrFilteringIgnorer.IgnoredPathFragments.of( - ignoredPathsBuilder.build()); - } - - /** - * Morally an {@code Either, PathFragment>}, saying whether the given - * set of ignored directories intersected a directory (in which case the directories that were - * in the intersection are returned) or completely contained it (in which case a containing - * directory is returned). - */ - public abstract static class IgnoredPathFragmentsInScopeOrFilteringIgnorer { - public abstract boolean wasFiltered(); - - public abstract ImmutableSet ignoredPathFragments(); - - public abstract PathFragment filteringIgnorer(); - - private static class IgnoredPathFragments - extends IgnoredPathFragmentsInScopeOrFilteringIgnorer { - private static final IgnoredPathFragments EMPTYSET_IGNORED = - new IgnoredPathFragments(ImmutableSet.of()); - - private final ImmutableSet ignoredPathFragments; - - private IgnoredPathFragments(ImmutableSet ignoredPathFragments) { - this.ignoredPathFragments = ignoredPathFragments; - } - - static IgnoredPathFragments of(ImmutableSet ignoredPathFragments) { - if (ignoredPathFragments.isEmpty()) { - return EMPTYSET_IGNORED; - } - return new IgnoredPathFragments(ignoredPathFragments); - } - - @Override - public boolean wasFiltered() { - return false; - } - - @Override - public ImmutableSet ignoredPathFragments() { - return ignoredPathFragments; - } - - @Override - public PathFragment filteringIgnorer() { - throw new UnsupportedOperationException("No filter: " + ignoredPathFragments); - } - } - - private static class FilteringIgnorer extends IgnoredPathFragmentsInScopeOrFilteringIgnorer { - private final PathFragment filteringIgnorer; - - FilteringIgnorer(PathFragment filteringIgnorer) { - this.filteringIgnorer = filteringIgnorer; - } - - @Override - public boolean wasFiltered() { - return true; - } - - @Override - public ImmutableSet ignoredPathFragments() { - throw new UnsupportedOperationException("was filtered: " + filteringIgnorer); - } - - @Override - public PathFragment filteringIgnorer() { - return filteringIgnorer; - } - } - } - /** Is {@code containingDirectory} an ancestor of or equal to this {@link #directory}? */ public boolean containedIn(PathFragment containingDirectory) { return directory.getPackageFragment().startsWith(containingDirectory); diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java index 03fdb98ba61071..3be39282546a94 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPatternResolver.java @@ -97,7 +97,7 @@ void findTargetsBeneathDirectory( String originalPattern, String directory, boolean rulesOnly, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) @@ -115,7 +115,7 @@ ListenableFuture findTargetsBeneathDirectoryAsync( String originalPattern, String directory, boolean rulesOnly, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass, diff --git a/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java b/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java index 304aad3eb16754..d94906edd6471f 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java +++ b/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java @@ -18,10 +18,10 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.util.concurrent.SettableFuture; import com.google.devtools.build.lib.actions.ThreadStateReceiver; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.concurrent.ThreadSafety; import com.google.devtools.build.lib.packages.Globber.BadGlobException; @@ -81,7 +81,7 @@ public class GlobCache { private final CachingPackageLocator packageLocator; - private final ImmutableSet ignoredGlobPrefixes; + private final IgnoredSubdirectories ignoredSubdirectories; /** * Create a glob expansion cache. @@ -98,7 +98,7 @@ public class GlobCache { public GlobCache( final Path packageDirectory, final PackageIdentifier packageId, - final ImmutableSet ignoredGlobPrefixes, + final IgnoredSubdirectories ignoredSubdirectories, final CachingPackageLocator locator, SyscallCache syscallCache, Executor globExecutor, @@ -120,7 +120,7 @@ public GlobCache( Preconditions.checkNotNull(locator); this.packageLocator = locator; - this.ignoredGlobPrefixes = ignoredGlobPrefixes; + this.ignoredSubdirectories = ignoredSubdirectories; } private boolean globCacheShouldTraverseDirectory(Path directory) { @@ -131,10 +131,8 @@ private boolean globCacheShouldTraverseDirectory(Path directory) { PathFragment subPackagePath = packageId.getPackageFragment().getRelative(directory.relativeTo(packageDirectory)); - for (PathFragment ignoredPrefix : ignoredGlobPrefixes) { - if (subPackagePath.startsWith(ignoredPrefix)) { - return false; - } + if (ignoredSubdirectories.matchingEntry(subPackagePath) != null) { + return false; } return !isSubPackage(PackageIdentifier.create(packageId.getRepository(), subPackagePath)); diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java index 726df4e1e0aaa7..5af4d4d2313440 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java @@ -18,10 +18,10 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.flogger.GoogleLogger; import com.google.devtools.build.lib.actions.ThreadStateReceiver; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.concurrent.NamedForkJoinPool; @@ -41,7 +41,6 @@ import com.google.devtools.build.lib.util.DetailedExitCode; import com.google.devtools.build.lib.vfs.FileSystem; 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.lib.vfs.SyscallCache; import com.google.errorprone.annotations.CanIgnoreReturnValue; @@ -266,14 +265,14 @@ public Package.Builder newPackageBuilder( public NonSkyframeGlobber createNonSkyframeGlobber( Path packageDirectory, PackageIdentifier packageId, - ImmutableSet ignoredGlobPrefixes, + IgnoredSubdirectories ignoredSubdirectories, CachingPackageLocator locator, ThreadStateReceiver threadStateReceiverForMetrics) { return new NonSkyframeGlobber( new GlobCache( packageDirectory, packageId, - ignoredGlobPrefixes, + ignoredSubdirectories, locator, syscallCache, executor, diff --git a/src/main/java/com/google/devtools/build/lib/packages/producers/DirectoryDirentProducer.java b/src/main/java/com/google/devtools/build/lib/packages/producers/DirectoryDirentProducer.java index e6da99abc25d81..b8a7230b19ba34 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/producers/DirectoryDirentProducer.java +++ b/src/main/java/com/google/devtools/build/lib/packages/producers/DirectoryDirentProducer.java @@ -76,10 +76,8 @@ final class DirectoryDirentProducer implements StateMachine, Consumer @Override public StateMachine step(Tasks tasks) { // Check whether the next directory path matches any `IgnoredPackagePrefix`. - for (PathFragment ignoredPrefix : globDetail.ignoredPackagePrefixesPatterns()) { - if (direntPath.startsWith(ignoredPrefix)) { - return DONE; - } + if (globDetail.ignoredSubdirectories().matchingEntry(direntPath) != null) { + return DONE; } tasks.lookUp( diff --git a/src/main/java/com/google/devtools/build/lib/packages/producers/GlobComputationProducer.java b/src/main/java/com/google/devtools/build/lib/packages/producers/GlobComputationProducer.java index 343ff6d084ea38..f8514cb398a4f0 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/producers/GlobComputationProducer.java +++ b/src/main/java/com/google/devtools/build/lib/packages/producers/GlobComputationProducer.java @@ -20,6 +20,7 @@ import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.packages.Globber; import com.google.devtools.build.lib.skyframe.GlobDescriptor; @@ -75,16 +76,16 @@ public interface ResultSink { // -------------------- Internal State -------------------- private final ImmutableSet.Builder pathFragmentsWithPackageFragment; - private final ImmutableSet ignoredPackagePrefixPatterns; + private final IgnoredSubdirectories ignoredSubdirectories; private final ConcurrentHashMap regexPatternCache; public GlobComputationProducer( GlobDescriptor globDescriptor, - ImmutableSet ignoredPackagePrefixPatterns, + IgnoredSubdirectories ignoredSubdirectories, ConcurrentHashMap regexPatternCache, ResultSink resultSink) { this.globDescriptor = globDescriptor; - this.ignoredPackagePrefixPatterns = ignoredPackagePrefixPatterns; + this.ignoredSubdirectories = ignoredSubdirectories; this.regexPatternCache = regexPatternCache; this.resultSink = resultSink; this.pathFragmentsWithPackageFragment = ImmutableSet.builder(); @@ -92,7 +93,7 @@ public GlobComputationProducer( @Override public StateMachine step(Tasks tasks) { - Preconditions.checkNotNull(ignoredPackagePrefixPatterns); + Preconditions.checkNotNull(ignoredSubdirectories); ImmutableList patterns = ImmutableList.copyOf(Splitter.on('/').split(globDescriptor.getPattern())); GlobDetail globDetail = @@ -101,7 +102,7 @@ public StateMachine step(Tasks tasks) { globDescriptor.getPackageRoot(), patterns, /* containsMultipleDoubleStars= */ Collections.frequency(patterns, "**") > 1, - ignoredPackagePrefixPatterns, + ignoredSubdirectories, regexPatternCache, globDescriptor.globberOperation()); Set> visitedGlobSubTasks = null; @@ -156,7 +157,7 @@ static GlobDetail create( Root packageRoot, ImmutableList patternFragments, boolean containsMultipleDoubleStars, - ImmutableSet ignoredPackagePrefixesPatterns, + IgnoredSubdirectories ignoredPackagePrefixesPatterns, ConcurrentHashMap regexPatternCache, Globber.Operation globOperation) { return new AutoValue_GlobComputationProducer_GlobDetail( @@ -183,7 +184,7 @@ static GlobDetail create( */ abstract boolean containsMultipleDoubleStars(); - abstract ImmutableSet ignoredPackagePrefixesPatterns(); + abstract IgnoredSubdirectories ignoredSubdirectories(); abstract ConcurrentHashMap regexPatternCache(); 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 a513f390316093..fd1f75bf6f2c06 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 @@ -15,6 +15,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; @@ -57,9 +58,11 @@ void streamPackagesUnderDirectory( ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, - ImmutableSet ignoredSubdirectories, + IgnoredSubdirectories ignoredSubdirectories, ImmutableSet excludedSubdirectories) - throws InterruptedException, QueryException, NoSuchPackageException, + throws InterruptedException, + QueryException, + NoSuchPackageException, ProcessPackageDirectoryException; /** @@ -124,7 +127,7 @@ public void streamPackagesUnderDirectory( ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, - ImmutableSet ignoredSubdirectories, + IgnoredSubdirectories ignoredSubdirectories, ImmutableSet excludedSubdirectories) { throw new UnsupportedOperationException(); } 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 2bf3e267324180..93664aa9b5faac 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 @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue; import com.google.devtools.build.lib.analysis.configuredtargets.OutputFileConfiguredTarget; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.cmdline.TargetParsingException; @@ -77,7 +78,6 @@ import com.google.devtools.build.lib.skyframe.SkyFunctions; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; import com.google.devtools.build.lib.supplier.InterruptibleSupplier; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import com.google.devtools.build.skyframe.WalkableGraph; @@ -258,15 +258,15 @@ private boolean isAliasConfiguredTarget(ConfiguredTargetKey key) throws Interrup protected abstract boolean isAliasConfiguredTarget(T target); - public InterruptibleSupplier> getIgnoredPackagePrefixesPathFragments( + public InterruptibleSupplier getIgnoredPackagePrefixesPathFragments( RepositoryName repositoryName) { return () -> { IgnoredPackagePrefixesValue ignoredPackagePrefixesValue = (IgnoredPackagePrefixesValue) walkableGraphSupplier.get().getValue(IgnoredPackagePrefixesValue.key(repositoryName)); return ignoredPackagePrefixesValue == null - ? ImmutableSet.of() - : ignoredPackagePrefixesValue.getPatterns(); + ? IgnoredSubdirectories.EMPTY + : ignoredPackagePrefixesValue.asIgnoredSubdirectories(); }; } diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java index 7441230987b088..6bef4d2bb17983 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java @@ -896,7 +896,7 @@ public QueryTaskFuture evalTargetPatternKey( ((IgnoredPackagePrefixesValue) graph.getValue( IgnoredPackagePrefixesValue.key(patternToEval.getRepository()))) - .getPatterns(), + .asIgnoredSubdirectories(), targetPatternKey.getExcludedSubdirectories(), filteredCallback, QueryException.class, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD index c9dcc3e3571457..3b984ccaf13323 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD @@ -1049,7 +1049,6 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant", "//src/main/java/com/google/devtools/build/lib/vfs", - "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//third_party:guava", "//third_party:jsr305", @@ -1291,9 +1290,9 @@ java_library( ":broken_diff_awareness_exception", ":incompatible_view_exception", ":workspace_info", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/common/options", - "//third_party:guava", "//third_party:jsr305", ], ) @@ -1306,6 +1305,7 @@ java_library( ":diff_awareness", ":incompatible_view_exception", ":workspace_info", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/profiler", "//src/main/java/com/google/devtools/build/lib/vfs", @@ -1736,6 +1736,7 @@ java_library( ":broken_diff_awareness_exception", ":diff_awareness", ":incompatible_view_exception", + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/jni", "//src/main/java/com/google/devtools/build/lib/util:os", "//src/main/java/com/google/devtools/build/lib/vfs", @@ -2065,7 +2066,6 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant", "//src/main/java/com/google/devtools/build/lib/vfs", - "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//third_party:guava", ], @@ -2246,7 +2246,6 @@ java_library( "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", - "//third_party:guava", ], ) @@ -2270,9 +2269,7 @@ java_library( ":recursive_pkg_key", "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/vfs", - "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", - "//third_party:guava", ], ) @@ -2290,9 +2287,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant", "//src/main/java/com/google/devtools/build/lib/vfs", - "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", - "//third_party:guava", ], ) 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 f73cb01125294b..c2867d690c3187 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 @@ -14,9 +14,9 @@ package com.google.devtools.build.lib.skyframe; 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.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.skyframe.ProcessPackageDirectory.ProcessPackageDirectorySkyFunctionException; import com.google.devtools.build.lib.vfs.PathFragment; @@ -65,7 +65,7 @@ protected MyPackageDirectoryConsumer getInitialConsumer() { protected SkyKey getSkyKeyForSubdirectory( RepositoryName repository, RootedPath subdirectory, - ImmutableSet excludedSubdirectoriesBeneathSubdirectory) { + IgnoredSubdirectories excludedSubdirectoriesBeneathSubdirectory) { return CollectPackagesUnderDirectoryValue.key( repository, subdirectory, excludedSubdirectoriesBeneathSubdirectory); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java index 8f699c7cf97eb0..38ecc506ae5da4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java @@ -16,13 +16,12 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.VisibleForSerialization; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -228,7 +227,7 @@ public static CollectPackagesUnderDirectoryValue ofNoError( /** Create a collect packages under directory request. */ @ThreadSafe public static SkyKey key( - RepositoryName repository, RootedPath rootedPath, ImmutableSet excludedPaths) { + RepositoryName repository, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { return Key.create(repository, rootedPath, excludedPaths); } @@ -238,17 +237,13 @@ static class Key extends RecursivePkgSkyKey { private static final SkyKeyInterner interner = SkyKey.newInterner(); private Key( - RepositoryName repositoryName, - RootedPath rootedPath, - ImmutableSet excludedPaths) { + RepositoryName repositoryName, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { super(repositoryName, rootedPath, excludedPaths); } @VisibleForSerialization static Key create( - RepositoryName repositoryName, - RootedPath rootedPath, - ImmutableSet excludedPaths) { + RepositoryName repositoryName, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { return interner.intern(new Key(repositoryName, rootedPath, excludedPaths)); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwareness.java b/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwareness.java index d99da50dfe8ad3..bd7f661befed3e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwareness.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwareness.java @@ -13,9 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.vfs.ModifiedFileSet; -import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.common.options.OptionsProvider; import java.io.Closeable; @@ -44,7 +43,7 @@ interface Factory { */ @Nullable DiffAwareness maybeCreate( - Root pathEntry, ImmutableSet ignoredPaths, OptionsProvider optionsProvider); + Root pathEntry, IgnoredSubdirectories ignoredPaths, OptionsProvider optionsProvider); } /** Opaque view of the filesystem under a package path entry at a specific point in time. */ diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManager.java b/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManager.java index 57af840e11172e..1e01456f0d8798 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManager.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManager.java @@ -15,16 +15,15 @@ import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.flogger.GoogleLogger; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.profiler.SilentCloseable; import com.google.devtools.build.lib.skyframe.DiffAwareness.View; import com.google.devtools.build.lib.vfs.ModifiedFileSet; -import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.common.options.OptionsProvider; import java.util.Map; @@ -45,13 +44,13 @@ public final class DiffAwarenessManager { /** The unique key to retrieve a DiffAwarenessState. */ @AutoValue public abstract static class StateKey { - private static StateKey create(Root root, ImmutableSet ignoredPaths) { + private static StateKey create(Root root, IgnoredSubdirectories ignoredPaths) { return new AutoValue_DiffAwarenessManager_StateKey(root, ignoredPaths); } abstract Root root(); - abstract ImmutableSet ignoredPaths(); + abstract IgnoredSubdirectories ignoredPaths(); } private final Map currentDiffAwarenessStates = Maps.newHashMap(); @@ -104,7 +103,7 @@ public interface ProcessableModifiedFileSet { public ProcessableModifiedFileSet getDiff( EventHandler eventHandler, Root pathEntry, - ImmutableSet ignoredPaths, + IgnoredSubdirectories ignoredPaths, OptionsProvider options) throws InterruptedException { DiffAwarenessState diffAwarenessState = @@ -140,7 +139,7 @@ public ProcessableModifiedFileSet getDiff( private void handleBrokenDiffAwareness( EventHandler eventHandler, Root pathEntry, - ImmutableSet ignoredPaths, + IgnoredSubdirectories ignoredPaths, BrokenDiffAwarenessException e) { StateKey stateKey = StateKey.create(pathEntry, ignoredPaths); currentDiffAwarenessStates.remove(stateKey); @@ -155,7 +154,7 @@ private void handleBrokenDiffAwareness( */ @Nullable private DiffAwarenessState maybeGetDiffAwarenessState( - Root pathEntry, ImmutableSet ignoredPaths, OptionsProvider options) { + Root pathEntry, IgnoredSubdirectories ignoredPaths, OptionsProvider options) { StateKey stateKey = StateKey.create(pathEntry, ignoredPaths); DiffAwarenessState diffAwarenessState = currentDiffAwarenessStates.get(stateKey); if (diffAwarenessState != null) { @@ -185,12 +184,12 @@ private class ProcessableModifiedFileSetImpl implements ProcessableModifiedFileS */ private final View nextView; - private final ImmutableSet ignoredPaths; + private final IgnoredSubdirectories ignoredPaths; private ProcessableModifiedFileSetImpl( ModifiedFileSet modifiedFileSet, Root pathEntry, - ImmutableSet ignoredPaths, + IgnoredSubdirectories ignoredPaths, View nextView) { this.modifiedFileSet = modifiedFileSet; this.pathEntry = pathEntry; 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 bd0870948a71ac..bac058008de402 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.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; @@ -166,7 +167,7 @@ public void streamPackagesUnderDirectory( ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, - ImmutableSet ignoredSubdirectories, + IgnoredSubdirectories ignoredSubdirectories, ImmutableSet excludedSubdirectories) throws InterruptedException, NoSuchPackageException, ProcessPackageDirectoryException { PathPackageLocator packageLocator = PrecomputedValue.PATH_PACKAGE_LOCATOR.get(env); @@ -194,9 +195,8 @@ public void streamPackagesUnderDirectory( roots.add(Root.fromPath(repositoryValue.getPath())); } - ImmutableSet filteredIgnoredSubdirectories = - ImmutableSet.copyOf( - Iterables.filter(ignoredSubdirectories, path -> path.startsWith(directory))); + IgnoredSubdirectories filteredIgnoredSubdirectories = + ignoredSubdirectories.filterForDirectory(directory); Iterable recursivePackageKeys = Iterables.transform( diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java index 58b8636d2e2f85..5553ce351300bf 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java @@ -20,6 +20,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -63,10 +64,9 @@ public SkyValue compute(SkyKey skyKey, Environment env) PathFragment globSubdir = glob.getSubdir(); PathFragment dirPathFragment = glob.getPackageId().getPackageFragment().getRelative(globSubdir); - for (PathFragment ignoredPrefix : ignoredPackagePrefixes.getPatterns()) { - if (dirPathFragment.startsWith(ignoredPrefix)) { - return GlobValueWithNestedSet.EMPTY; - } + IgnoredSubdirectories ignoredSubdirectories = ignoredPackagePrefixes.asIgnoredSubdirectories(); + if (ignoredSubdirectories.matchingEntry(dirPathFragment) != null) { + return GlobValueWithNestedSet.EMPTY; } String pattern = glob.getPattern(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithRecursionInSingleFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithRecursionInSingleFunction.java index ec5d9111a0e83f..592ffd11578577 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithRecursionInSingleFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithRecursionInSingleFunction.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.packages.producers.GlobComputationProducer; import com.google.devtools.build.lib.packages.producers.GlobError; @@ -49,7 +50,7 @@ private static class State implements SkyKeyComputeState, GlobComputationProduce @Nullable // Non-null while in-flight. private Driver globComputationDriver; - @Nullable ImmutableSet ignorePackagePrefixesPatterns; + @Nullable IgnoredSubdirectories ignoredSubdirectories; private ImmutableSet globMatchingResult; private GlobError error; @@ -80,7 +81,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) GlobDescriptor glob = (GlobDescriptor) skyKey.argument(); State state = env.getState(State::new); - if (state.ignorePackagePrefixesPatterns == null) { + if (state.ignoredSubdirectories == null) { RepositoryName repositoryName = glob.getPackageId().getRepository(); IgnoredPackagePrefixesValue ignoredPackagePrefixes = (IgnoredPackagePrefixesValue) @@ -88,14 +89,14 @@ public SkyValue compute(SkyKey skyKey, Environment env) if (env.valuesMissing()) { return null; } - state.ignorePackagePrefixesPatterns = ignoredPackagePrefixes.getPatterns(); + state.ignoredSubdirectories = ignoredPackagePrefixes.asIgnoredSubdirectories(); } if (state.globComputationDriver == null) { state.globComputationDriver = new Driver( new GlobComputationProducer( - glob, state.ignorePackagePrefixesPatterns, regexPatternCache, state)); + glob, state.ignoredSubdirectories, regexPatternCache, state)); } if (!state.globComputationDriver.drive(env)) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobsFunction.java index f60a16da1851ac..04b72d07abac30 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobsFunction.java @@ -16,6 +16,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.common.util.concurrent.Uninterruptibles; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.concurrent.QuiescingExecutor; import com.google.devtools.build.lib.packages.producers.GlobComputationProducer; @@ -73,7 +74,7 @@ public final class GlobsFunction implements SkyFunction { private static class State implements SkyKeyComputeState, GlobComputationProducer.ResultSink { @Nullable private List globDrivers; - @Nullable ImmutableSet ignorePackagePrefixesPatterns; + @Nullable IgnoredSubdirectories ignoredSubdirectories; private final Set matchings = Sets.newConcurrentHashSet(); private volatile GlobError error; @@ -109,7 +110,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) GlobsValue.Key globsKey = (GlobsValue.Key) skyKey; State state = env.getState(State::new); - if (state.ignorePackagePrefixesPatterns == null) { + if (state.ignoredSubdirectories == null) { RepositoryName repositoryName = globsKey.getPackageIdentifier().getRepository(); IgnoredPackagePrefixesValue ignoredPackagePrefixes = (IgnoredPackagePrefixesValue) @@ -117,7 +118,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) if (env.valuesMissing()) { return null; } - state.ignorePackagePrefixesPatterns = ignoredPackagePrefixes.getPatterns(); + state.ignoredSubdirectories = ignoredPackagePrefixes.asIgnoredSubdirectories(); } if (state.globDrivers == null) { @@ -135,10 +136,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) state.globDrivers.add( new Driver( new GlobComputationProducer( - globDescriptor, - state.ignorePackagePrefixesPatterns, - regexPatternCache, - state))); + globDescriptor, state.ignoredSubdirectories, regexPatternCache, state))); } } 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 45e4a0c8dd1a08..119b8eef120fed 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 @@ -23,6 +23,7 @@ import com.google.common.collect.Sets.SetView; import com.google.common.flogger.GoogleLogger; import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.cmdline.TargetPattern; @@ -244,7 +245,7 @@ public void streamPackagesUnderDirectory( ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, - ImmutableSet ignoredSubdirectories, + IgnoredSubdirectories ignoredSubdirectories, ImmutableSet excludedSubdirectories) throws InterruptedException, QueryException { rootPackageExtractor.streamPackagesFromRoots( diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/IgnoredPackagePrefixesValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/IgnoredPackagePrefixesValue.java index 46dfbe7e7e1a4e..237bfd0a3148a8 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/IgnoredPackagePrefixesValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/IgnoredPackagePrefixesValue.java @@ -13,8 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.skyframe.serialization.VisibleForSerialization; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; @@ -27,18 +27,26 @@ /** An immutable set of package name prefixes that should be ignored. */ public class IgnoredPackagePrefixesValue implements SkyValue { - private final ImmutableSet patterns; + private final IgnoredSubdirectories ignoredSubdirectories; @SerializationConstant @VisibleForSerialization - public static final IgnoredPackagePrefixesValue EMPTY_LIST = - new IgnoredPackagePrefixesValue(ImmutableSet.of()); + public static final IgnoredPackagePrefixesValue EMPTY = + new IgnoredPackagePrefixesValue(IgnoredSubdirectories.EMPTY); - private IgnoredPackagePrefixesValue(ImmutableSet patterns) { - this.patterns = Preconditions.checkNotNull(patterns); + private IgnoredPackagePrefixesValue(IgnoredSubdirectories ignoredSubdirectories) { + this.ignoredSubdirectories = ignoredSubdirectories; } public static IgnoredPackagePrefixesValue of(ImmutableSet patterns) { - return patterns.isEmpty() ? EMPTY_LIST : new IgnoredPackagePrefixesValue(patterns); + return patterns.isEmpty() + ? EMPTY + : new IgnoredPackagePrefixesValue(IgnoredSubdirectories.of(patterns)); + } + + public static IgnoredPackagePrefixesValue of(IgnoredSubdirectories ignoredSubdirectories) { + return ignoredSubdirectories.isEmpty() + ? EMPTY + : new IgnoredPackagePrefixesValue(ignoredSubdirectories); } /** Creates a key from the main repository. */ @@ -51,23 +59,28 @@ public static SkyKey key(RepositoryName repository) { return Key.create(repository); } - public ImmutableSet getPatterns() { - return patterns; + public IgnoredSubdirectories asIgnoredSubdirectories() { + return ignoredSubdirectories; } @Override public int hashCode() { - return patterns.hashCode(); + return ignoredSubdirectories.hashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof IgnoredPackagePrefixesValue other) { - return this.patterns.equals(other.patterns); + return this.ignoredSubdirectories.equals(other.ignoredSubdirectories); } return false; } + @Override + public String toString() { + return ignoredSubdirectories.toString(); + } + @VisibleForSerialization @AutoCodec static class Key extends AbstractSkyKey { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalPackageRoots.java b/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalPackageRoots.java index b4868b45a1beed..ecf026b65da1c5 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalPackageRoots.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalPackageRoots.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.analysis.AnalysisPhaseCompleteEvent; import com.google.devtools.build.lib.buildtool.SymlinkForest; import com.google.devtools.build.lib.buildtool.SymlinkForest.SymlinkPlantingException; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSet.Node; @@ -84,7 +85,7 @@ public class IncrementalPackageRoots implements PackageRoots { private final Root singleSourceRoot; private final String prefix; - private final ImmutableSet ignoredPaths; + private final IgnoredSubdirectories ignoredPaths; private final boolean useSiblingRepositoryLayout; private final boolean allowExternalRepositories; @@ -98,7 +99,7 @@ private IncrementalPackageRoots( Root singleSourceRoot, EventBus eventBus, String prefix, - ImmutableSet ignoredPaths, + IgnoredSubdirectories ignoredPaths, boolean useSiblingRepositoryLayout, boolean allowExternalRepositories) { this.threadSafeExternalRepoPackageRootsMap = Maps.newConcurrentMap(); @@ -121,7 +122,7 @@ public static IncrementalPackageRoots createAndRegisterToEventBus( Root singleSourceRoot, EventBus eventBus, String prefix, - ImmutableSet ignoredPaths, + IgnoredSubdirectories ignoredSubdirectories, boolean useSiblingRepositoryLayout, boolean allowExternalRepositories) { IncrementalPackageRoots incrementalPackageRoots = @@ -130,7 +131,7 @@ public static IncrementalPackageRoots createAndRegisterToEventBus( singleSourceRoot, eventBus, prefix, - ignoredPaths, + ignoredSubdirectories, useSiblingRepositoryLayout, allowExternalRepositories); eventBus.register(incrementalPackageRoots); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java b/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java index c5d696a96c2031..b4e472971d811d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/LocalDiffAwareness.java @@ -14,11 +14,11 @@ package com.google.devtools.build.lib.skyframe; -import static com.google.common.collect.ImmutableSet.toImmutableSet; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.util.OS; import com.google.devtools.build.lib.vfs.ModifiedFileSet; import com.google.devtools.build.lib.vfs.PathFragment; @@ -89,9 +89,7 @@ public Factory(ImmutableList excludedNetworkFileSystemsPrefixes) { @Override @Nullable public DiffAwareness maybeCreate( - Root pathEntry, - ImmutableSet ignoredPaths, - OptionsProvider optionsProvider) { + Root pathEntry, IgnoredSubdirectories ignoredPaths, OptionsProvider optionsProvider) { com.google.devtools.build.lib.vfs.Path resolvedPathEntry; try { resolvedPathEntry = pathEntry.asPath().resolveSymbolicLinks(); @@ -111,9 +109,7 @@ public DiffAwareness maybeCreate( return new MacOSXFsEventsDiffAwareness(resolvedPathEntryFragment.toString()); } - return new WatchServiceDiffAwareness( - resolvedPathEntryFragment.toString(), - ignoredPaths.stream().map(p -> Path.of(p.toString())).collect(toImmutableSet())); + return new WatchServiceDiffAwareness(resolvedPathEntryFragment.toString(), ignoredPaths); } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java index dcbff90d0ec55b..7d070f41fbb809 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java @@ -19,12 +19,12 @@ import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.ThreadStateReceiver; import com.google.devtools.build.lib.clock.BlazeClock; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; @@ -975,8 +975,8 @@ private LoadedPackage loadPackage( String workspaceName = workspaceNameValue.getName(); RepositoryMapping repositoryMapping = repositoryMappingValue.getRepositoryMapping(); RepositoryMapping mainRepositoryMapping = mainRepositoryMappingValue.getRepositoryMapping(); - ImmutableSet repositoryIgnoredPatterns = - repositoryIgnoredPackagePrefixes.getPatterns(); + IgnoredSubdirectories repositoryIgnoredSubdirectories = + repositoryIgnoredPackagePrefixes.asIgnoredSubdirectories(); Label preludeLabel = null; // Load (optional) prelude, which determines environment. @@ -1104,7 +1104,7 @@ private LoadedPackage loadPackage( packageFactory.createNonSkyframeGlobber( buildFileRootedPath.asPath().getParentDirectory(), packageId, - repositoryIgnoredPatterns, + repositoryIgnoredSubdirectories, packageLocator, threadStateReceiverFactoryForMetrics.apply(keyForMetrics)), packageId, 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 4f105a2bcf2709..f5c8bac8fc6233 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 @@ -136,7 +136,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) return null; } - if (isPackageIgnored(packageKey, ignoredPatternsValue)) { + PathFragment packageFragment = packageKey.getPackageFragment(); + if (ignoredPatternsValue.asIgnoredSubdirectories().matchingEntry(packageFragment) != null) { return PackageLookupValue.DELETED_PACKAGE_VALUE; } @@ -332,17 +333,6 @@ private PackageLookupValue getPackageLookupValue( return PackageLookupValue.NO_BUILD_FILE_VALUE; } - private static boolean isPackageIgnored( - PackageIdentifier id, IgnoredPackagePrefixesValue ignoredPatternsValue) { - PathFragment packageFragment = id.getPackageFragment(); - for (PathFragment pattern : ignoredPatternsValue.getPatterns()) { - if (packageFragment.startsWith(pattern)) { - return true; - } - } - return false; - } - @Nullable private PackageLookupValue computeWorkspacePackageLookupValue(Environment env) throws InterruptedException { @@ -414,7 +404,8 @@ private PackageLookupValue computeExternalPackageLookupValue( return null; } - if (isPackageIgnored(id, ignoredPatternsValue)) { + PathFragment packageFragment = id.getPackageFragment(); + if (ignoredPatternsValue.asIgnoredSubdirectories().matchingEntry(packageFragment) != null) { return PackageLookupValue.DELETED_PACKAGE_VALUE; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java index b69cab2e2aa91f..6ec79b9d6fd56f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.BatchCallback; import com.google.devtools.build.lib.cmdline.BatchCallback.NullCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; @@ -102,13 +103,10 @@ public SkyValue compute(SkyKey key, Environment env) // since it has to iterate over those exclusions to see if they fully exclude the directory even // though TargetPatternKey guarantees that the exclusions will not fully exclude the directory. ImmutableSet excludedPatterns = patternKey.getExcludedSubdirectories(); - ImmutableSet ignoredPatterns = repositoryIgnoredPrefixes.getPatterns(); - ImmutableSet repositoryIgnoredPatterns = - ImmutableSet.builderWithExpectedSize( - excludedPatterns.size() + ignoredPatterns.size()) - .addAll(excludedPatterns) - .addAll(ignoredPatterns) - .build(); + IgnoredSubdirectories repositoryIgnoredPatterns = + repositoryIgnoredPrefixes + .asIgnoredSubdirectories() + .union(IgnoredSubdirectories.of(excludedPatterns)); DepsOfPatternPreparer preparer = new DepsOfPatternPreparer(env, pkgPath.get()); @@ -302,7 +300,7 @@ public void findTargetsBen String originalPattern, String directory, boolean rulesOnly, - ImmutableSet repositoryIgnoredSubdirectories, + IgnoredSubdirectories repositoryIgnoredSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) @@ -342,7 +340,7 @@ env, getDeps(repository, repositoryIgnoredSubdirectories, policy, rootedPath))) private ImmutableList getDeps( RepositoryName repository, - ImmutableSet repositoryIgnoredSubdirectories, + IgnoredSubdirectories repositoryIgnoredSubdirectories, FilteringPolicy policy, RootedPath rootedPath) { List keys = new ArrayList<>(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java index 36c8ba7ab7f651..5052749d7431fc 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java @@ -15,7 +15,7 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.skyframe.serialization.VisibleForSerialization; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -51,8 +50,8 @@ private PrepareDepsOfTargetsUnderDirectoryValue() {} /** Create a prepare deps of targets under directory request. */ @ThreadSafe - public static SkyKey key(RepositoryName repository, RootedPath rootedPath, - ImmutableSet excludedPaths) { + public static SkyKey key( + RepositoryName repository, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { return key(repository, rootedPath, excludedPaths, FilteringPolicies.NO_FILTER); } @@ -64,7 +63,7 @@ public static SkyKey key(RepositoryName repository, RootedPath rootedPath, public static PrepareDepsOfTargetsUnderDirectoryKey key( RepositoryName repository, RootedPath rootedPath, - ImmutableSet excludedPaths, + IgnoredSubdirectories excludedPaths, FilteringPolicy filteringPolicy) { return PrepareDepsOfTargetsUnderDirectoryKey.create( new RecursivePkgKey(repository, rootedPath, excludedPaths), filteringPolicy); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java b/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java index e0f300fdce81c2..aa8d1383ab2cf2 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java @@ -13,14 +13,13 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import static com.google.common.collect.ImmutableSet.toImmutableSet; import com.google.common.base.Preconditions; 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.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; @@ -60,7 +59,7 @@ public interface SkyKeyTransformer { SkyKey makeSkyKey( RepositoryName repository, RootedPath subdirectory, - ImmutableSet excludedSubdirectoriesBeneathSubdirectory); + IgnoredSubdirectories excludedSubdirectoriesBeneathSubdirectory); } private final BlazeDirectories directories; @@ -81,7 +80,7 @@ public ProcessPackageDirectory( public ProcessPackageDirectoryResult getPackageExistenceAndSubdirDeps( RootedPath rootedPath, RepositoryName repositoryName, - ImmutableSet excludedPaths, + IgnoredSubdirectories excludedPaths, SkyFunction.Environment env) throws InterruptedException, ProcessPackageDirectorySkyFunctionException { PathFragment rootRelativePath = rootedPath.getRootRelativePath(); @@ -263,7 +262,7 @@ private Iterable getSubdirDeps( DirectoryListingValue dirListingValue, RootedPath rootedPath, RepositoryName repositoryName, - ImmutableSet excludedPaths, + IgnoredSubdirectories excludedPaths, boolean siblingRepositoryLayout) { Root root = rootedPath.getRoot(); PathFragment rootRelativePath = rootedPath.getRootRelativePath(); @@ -290,7 +289,7 @@ private Iterable getSubdirDeps( } // If this subdirectory is one of the excluded paths, don't recurse into it. - if (excludedPaths.contains(subdirectory)) { + if (excludedPaths.matchingEntry(subdirectory) != null) { continue; } @@ -298,7 +297,7 @@ private Iterable getSubdirDeps( skyKeyTransformer.makeSkyKey( repositoryName, RootedPath.toRootedPath(root, subdirectory), - getExcludedSubdirectoriesBeneathSubdirectory(subdirectory, excludedPaths))); + excludedPaths.filterForDirectory(subdirectory))); } return childDeps; } @@ -317,11 +316,9 @@ private Iterable getSubdirDeps( *

TODO(bazel-team): Replace the excludedPaths set with a trie or a SortedSet for better * efficiency. */ - public static ImmutableSet getExcludedSubdirectoriesBeneathSubdirectory( - PathFragment subdirectory, ImmutableSet excludedPaths) { - return excludedPaths.stream() - .filter(pathFragment -> pathFragment.startsWith(subdirectory)) - .collect(toImmutableSet()); + public static IgnoredSubdirectories getExcludedSubdirectoriesBeneathSubdirectory( + PathFragment subdirectory, IgnoredSubdirectories excludedPaths) { + return excludedPaths.filterForDirectory(subdirectory); } private static ProcessPackageDirectoryResult reportErrorAndReturn( 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 67004111091b06..210007489cc066 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 @@ -15,9 +15,9 @@ import com.google.common.collect.ImmutableList; 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.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; @@ -85,7 +85,7 @@ protected ProcessPackageDirectoryResult getProcessPackageDirectoryResult( protected abstract SkyKey getSkyKeyForSubdirectory( RepositoryName repository, RootedPath subdirectory, - ImmutableSet excludedSubdirectoriesBeneathSubdirectory); + IgnoredSubdirectories excludedSubdirectoriesBeneathSubdirectory); /** * Called by {@link #visitDirectory} to compute the {@code TReturn} value it returns, as a diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java index a800de8a07569a..f56094ef0ed4e4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePackageProviderBackedTargetPatternResolver.java @@ -30,6 +30,7 @@ import com.google.common.util.concurrent.Uninterruptibles; import com.google.devtools.build.lib.cmdline.BatchCallback; import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; @@ -195,7 +196,7 @@ public void findTargetsBen final String originalPattern, String directory, boolean rulesOnly, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass) @@ -242,7 +243,7 @@ ListenableFuture findTargetsBeneathDirectoryAsync( String originalPattern, String directory, boolean rulesOnly, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, Class exceptionClass, @@ -286,12 +287,15 @@ ListenableFuture findTargetsBeneathDirectoryAsyncImpl( String pattern, String directory, boolean rulesOnly, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories, BatchCallback callback, ListeningExecutorService executor) - throws TargetParsingException, QueryException, InterruptedException, - ProcessPackageDirectoryException, NoSuchPackageException { + throws TargetParsingException, + QueryException, + InterruptedException, + ProcessPackageDirectoryException, + NoSuchPackageException { FilteringPolicy actualPolicy = rulesOnly ? FilteringPolicies.and(FilteringPolicies.RULES_ONLY, policy) : policy; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java index c569c596b6f0f9..0ca5985a43932b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java @@ -13,8 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -66,7 +66,7 @@ protected MyPackageDirectoryConsumer getInitialConsumer() { protected SkyKey getSkyKeyForSubdirectory( RepositoryName repository, RootedPath subdirectory, - ImmutableSet excludedSubdirectoriesBeneathSubdirectory) { + IgnoredSubdirectories excludedSubdirectoriesBeneathSubdirectory) { return RecursivePkgValue.key( repository, subdirectory, excludedSubdirectoriesBeneathSubdirectory); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgKey.java index 3038da9b07d393..32e24ba48d2943 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgKey.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgKey.java @@ -16,6 +16,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.VisibleForSerialization; @@ -36,13 +37,11 @@ public class RecursivePkgKey { @VisibleForSerialization final RepositoryName repositoryName; @VisibleForSerialization final RootedPath rootedPath; - @VisibleForSerialization final ImmutableSet excludedPaths; + @VisibleForSerialization final IgnoredSubdirectories excludedPaths; public RecursivePkgKey( - RepositoryName repositoryName, - RootedPath rootedPath, - ImmutableSet excludedPaths) { - PathFragment.checkAllPathsAreUnder(excludedPaths, rootedPath.getRootRelativePath()); + RepositoryName repositoryName, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { + Preconditions.checkArgument(excludedPaths.allPathsAreUnder(rootedPath.getRootRelativePath())); this.repositoryName = repositoryName; this.rootedPath = Preconditions.checkNotNull(rootedPath); this.excludedPaths = Preconditions.checkNotNull(excludedPaths); @@ -56,7 +55,7 @@ public RootedPath getRootedPath() { return rootedPath; } - public ImmutableSet getExcludedPaths() { + public IgnoredSubdirectories getExcludedPaths() { return excludedPaths; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java index 8cbd4e8b3ddb88..6d9635e5cba6be 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java @@ -14,18 +14,15 @@ package com.google.devtools.build.lib.skyframe; -import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyKey; /** Common parent class of SkyKeys that wrap a {@link RecursivePkgKey}. */ public abstract class RecursivePkgSkyKey extends RecursivePkgKey implements SkyKey { public RecursivePkgSkyKey( - RepositoryName repositoryName, - RootedPath rootedPath, - ImmutableSet excludedPaths) { + RepositoryName repositoryName, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { super(repositoryName, rootedPath, excludedPaths); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java index ab6dd206889737..9b5ccaf5a755d6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java @@ -13,7 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -23,7 +23,6 @@ import com.google.devtools.build.lib.skyframe.serialization.VisibleForSerialization; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationConstant; -import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -58,9 +57,7 @@ static RecursivePkgValue create(NestedSetBuilder packages, boolean hasEr /** Create a transitive package lookup request. */ @ThreadSafe public static Key key( - RepositoryName repositoryName, - RootedPath rootedPath, - ImmutableSet excludedPaths) { + RepositoryName repositoryName, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { return Key.create(repositoryName, rootedPath, excludedPaths); } @@ -78,16 +75,12 @@ static class Key extends RecursivePkgSkyKey { private static final SkyKeyInterner interner = SkyKey.newInterner(); private Key( - RepositoryName repositoryName, - RootedPath rootedPath, - ImmutableSet excludedPaths) { + RepositoryName repositoryName, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { super(repositoryName, rootedPath, excludedPaths); } private static Key create( - RepositoryName repositoryName, - RootedPath rootedPath, - ImmutableSet excludedPaths) { + RepositoryName repositoryName, RootedPath rootedPath, IgnoredSubdirectories excludedPaths) { return interner.intern(new Key(repositoryName, rootedPath, excludedPaths)); } 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 47b27ea1960c50..07d74bb31771ff 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 @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.ExtendedEventHandler; @@ -39,12 +40,11 @@ public void streamPackagesFromRoots( ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, - ImmutableSet ignoredSubdirectories, + IgnoredSubdirectories ignoredSubdirectories, ImmutableSet excludedSubdirectories) throws InterruptedException, QueryException { - ImmutableSet filteredIgnoredSubdirectories = - ImmutableSet.copyOf( - Iterables.filter(ignoredSubdirectories, path -> path.startsWith(directory))); + IgnoredSubdirectories filteredIgnoredSubdirectories = + ignoredSubdirectories.filterForDirectory(directory); for (Root root : roots) { RootedPath rootedPath = RootedPath.toRootedPath(root, directory); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java index 758546a0d14590..7088ab6f146f5b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RootPackageExtractor.java @@ -15,6 +15,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.ExtendedEventHandler; @@ -51,7 +52,7 @@ void streamPackagesFromRoots( ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories) throws InterruptedException, QueryException; } 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 da79fb421cd145..050c3bad3d4713 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 @@ -20,7 +20,6 @@ import static com.google.common.base.Throwables.throwIfUnchecked; import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.ImmutableMap.toImmutableMap; -import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.devtools.build.lib.analysis.config.CommonOptions.EMPTY_OPTIONS; import static com.google.devtools.build.lib.concurrent.Uninterruptibles.callUninterruptibly; import static com.google.devtools.build.lib.skyframe.ArtifactConflictFinder.ACTION_CONFLICTS; @@ -121,6 +120,7 @@ import com.google.devtools.build.lib.bazel.repository.RepositoryOptions; import com.google.devtools.build.lib.bugreport.BugReporter; import com.google.devtools.build.lib.buildtool.BuildRequestOptions; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.Label.LabelInterner; import com.google.devtools.build.lib.cmdline.Label.PackageContext; @@ -494,7 +494,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { private Set previousClientEnvironment = ImmutableSet.of(); // Contain the paths in the .bazelignore file. - private ImmutableSet ignoredPaths = ImmutableSet.of(); + private IgnoredSubdirectories ignoredPaths = IgnoredSubdirectories.EMPTY; Duration sourceDiffCheckingDuration = Duration.ofSeconds(-1L); @@ -1402,7 +1402,7 @@ public AtomicReference getPackageLocator() { return pkgLocator; } - public ImmutableSet getIgnoredPaths() { + public IgnoredSubdirectories getIgnoredPaths() { return ignoredPaths; } @@ -3288,9 +3288,9 @@ protected WorkspaceInfoFromDiff handleDiffs( && workspacePath.equals(pathEntry.asPath()) && ignoredPackagePrefixesValue != null) { ignoredPaths = - ignoredPackagePrefixesValue.getPatterns().stream() - .map(pathEntry::getRelative) - .collect(toImmutableSet()); + ignoredPackagePrefixesValue + .asIgnoredSubdirectories() + .withPrefix(pathEntry.asPath().asFragment().toRelative()); } DiffAwarenessManager.ProcessableModifiedFileSet modifiedFileSet = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java index 09917ef451d424..6abd92414d4adc 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java @@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.bugreport.BugReport; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; @@ -300,8 +301,8 @@ public Collection process( try { targetPattern.eval( resolver, - /*ignoredSubdirectories=*/ ImmutableSet::of, - /*excludedSubdirectories=*/ ImmutableSet.of(), + /* ignoredSubdirectories= */ () -> IgnoredSubdirectories.EMPTY, + /* excludedSubdirectories= */ ImmutableSet.of(), partialResult -> result.set( partialResult instanceof Collection diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java index 7c50e046471742..9fc8c59148369f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java @@ -58,7 +58,6 @@ public SkyValue compute(SkyKey key, Environment env) if (ignoredPackagePrefixes == null) { return null; } - ImmutableSet ignoredPatterns = ignoredPackagePrefixes.getPatterns(); ResolvedTargets resolvedTargets; EnvironmentBackedRecursivePackageProvider provider = @@ -91,7 +90,7 @@ public SkyValue compute(SkyKey key, Environment env) try { parsedPattern.eval( resolver, - () -> ignoredPatterns, + () -> ignoredPackagePrefixes.asIgnoredSubdirectories(), excludedSubdirectories, callback, QueryExceptionMarkerInterface.MarkerRuntimeException.class); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java index 2e4ad9fe5388ef..302dd7e82076eb 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TraversalInfoRootPackageExtractor.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.devtools.build.lib.cmdline.BatchCallback.SafeBatchCallback; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.ParallelVisitor; import com.google.devtools.build.lib.cmdline.QueryExceptionMarkerInterface; @@ -59,7 +60,7 @@ public void streamPackagesFromRoots( ExtendedEventHandler eventHandler, RepositoryName repository, PathFragment directory, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories) throws InterruptedException { TreeSet dirsToCheckForPackages = new TreeSet<>(TRAVERSAL_INFO_COMPARATOR); @@ -175,10 +176,8 @@ protected Visit getVisitResult(Iterable dirsToCheckForPackages) for (RootedPath subdirectory : subdirectoryTransitivelyContainsPackages.keySet()) { if (subdirectoryTransitivelyContainsPackages.get(subdirectory)) { PathFragment subdirectoryRelativePath = subdirectory.getRootRelativePath(); - ImmutableSet forbiddenSubdirectoriesBeneathThisSubdirectory = - info.forbiddenSubdirectories.stream() - .filter(pathFragment -> pathFragment.startsWith(subdirectoryRelativePath)) - .collect(toImmutableSet()); + IgnoredSubdirectories forbiddenSubdirectoriesBeneathThisSubdirectory = + info.forbiddenSubdirectories.filterForDirectory(subdirectoryRelativePath); ImmutableSet excludedSubdirectoriesBeneathThisSubdirectory = info.excludedSubdirectories.stream() .filter(pathFragment -> pathFragment.startsWith(subdirectoryRelativePath)) @@ -218,7 +217,7 @@ private static final class TraversalInfo { // CollectPackagesUnderDirectoryValue nodes whose keys have forbidden packages embedded in // them. Therefore, we need to be careful to request and use the same sort of keys here in our // traversal. - final ImmutableSet forbiddenSubdirectories; + final IgnoredSubdirectories forbiddenSubdirectories; // Set of directories, targets under which should be excluded from the traversal results. // Excluded directory information isn't part of the graph keys in the prepopulated graph, so we // need to perform the filtering ourselves. @@ -226,7 +225,7 @@ private static final class TraversalInfo { private TraversalInfo( RootedPath rootedDir, - ImmutableSet forbiddenSubdirectories, + IgnoredSubdirectories forbiddenSubdirectories, ImmutableSet excludedSubdirectories) { this.rootedDir = rootedDir; this.forbiddenSubdirectories = forbiddenSubdirectories; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WatchServiceDiffAwareness.java b/src/main/java/com/google/devtools/build/lib/skyframe/WatchServiceDiffAwareness.java index 3256465308211d..8e4d1ba0a832b7 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WatchServiceDiffAwareness.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WatchServiceDiffAwareness.java @@ -18,7 +18,9 @@ import com.google.common.base.Preconditions; import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.util.OS; +import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.common.options.OptionsProvider; import java.io.IOException; import java.nio.file.ClosedWatchServiceException; @@ -53,9 +55,9 @@ public final class WatchServiceDiffAwareness extends LocalDiffAwareness { /** Every directory is registered under this watch service. */ private WatchService watchService; - private final ImmutableSet ignoredPaths; + private final IgnoredSubdirectories ignoredPaths; - WatchServiceDiffAwareness(String watchRoot, ImmutableSet ignoredPaths) { + WatchServiceDiffAwareness(String watchRoot, IgnoredSubdirectories ignoredPaths) { super(watchRoot); this.ignoredPaths = ignoredPaths; } @@ -283,14 +285,14 @@ private Set registerSubDirectoriesAndReturnContents(Path rootDir) throws I private class WatcherFileVisitor extends SimpleFileVisitor { private final Set visitedAbsolutePaths; - private final Set ignoredPaths; + private final IgnoredSubdirectories ignoredPaths; - private WatcherFileVisitor(Set visitedPaths, Set ignoredPaths) { + private WatcherFileVisitor(Set visitedPaths, IgnoredSubdirectories ignoredPaths) { this.visitedAbsolutePaths = visitedPaths; this.ignoredPaths = ignoredPaths; } - private WatcherFileVisitor(Set ignoredPaths) { + private WatcherFileVisitor(IgnoredSubdirectories ignoredPaths) { this.visitedAbsolutePaths = new HashSet<>(); this.ignoredPaths = ignoredPaths; } @@ -305,7 +307,9 @@ public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) { @Override public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs) throws IOException { - if (ignoredPaths.contains(path)) { + PathFragment pathFragment = + PathFragment.create(path.toAbsolutePath().toString()).toRelative(); + if (ignoredPaths.matchingEntry(pathFragment) != null) { return FileVisitResult.SKIP_SUBTREE; } diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java index 49b1fd674ad769..ad04691d17717a 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.events.ExtendedEventHandler; @@ -141,7 +142,7 @@ private static Object exec(String... lines) { private void setUpContextForRule( Map kwargs, - ImmutableSet ignoredPathFragments, + IgnoredSubdirectories ignoredSubdirectories, ImmutableMap envVariables, StarlarkSemantics starlarkSemantics, @Nullable RepositoryRemoteExecutor repoRemoteExecutor, @@ -190,7 +191,7 @@ private void setUpContextForRule( rule, packageLocator, outputDirectory, - ignoredPathFragments, + ignoredSubdirectories, environment, envVariables, downloader, @@ -210,7 +211,7 @@ private void setUpContextForRule(String name, StarlarkSemantics starlarkSemantic throws Exception { setUpContextForRule( ImmutableMap.of("name", name), - ImmutableSet.of(), + IgnoredSubdirectories.EMPTY, ImmutableMap.of("FOO", "BAR"), starlarkSemantics, /* repoRemoteExecutor= */ null); @@ -220,7 +221,7 @@ private void setUpContextForRule(String name, StarlarkSemantics starlarkSemantic public void testAttr() throws Exception { setUpContextForRule( ImmutableMap.of("name", "test", "foo", "bar"), - ImmutableSet.of(), + IgnoredSubdirectories.EMPTY, ImmutableMap.of("FOO", "BAR"), StarlarkSemantics.DEFAULT, /* repoRemoteExecutor= */ null, @@ -234,7 +235,7 @@ public void testAttr() throws Exception { public void testWhich() throws Exception { setUpContextForRule( ImmutableMap.of("name", "test"), - ImmutableSet.of(), + IgnoredSubdirectories.EMPTY, ImmutableMap.of("PATH", String.join(File.pathSeparator, "/bin", "/path/sbin", ".")), StarlarkSemantics.DEFAULT, /* repoRemoteExecutor= */ null); @@ -325,7 +326,7 @@ public void testDelete() throws Exception { scratch.file(underWorkspace.getPathString(), "123"); setUpContextForRule( ImmutableMap.of("name", "test"), - ImmutableSet.of(PathFragment.create("under_workspace")), + IgnoredSubdirectories.of(ImmutableSet.of(PathFragment.create("under_workspace"))), ImmutableMap.of("FOO", "BAR"), StarlarkSemantics.DEFAULT, /* repoRemoteExecutor= */ null); @@ -443,7 +444,7 @@ public void testRemoteExec() throws Exception { setUpContextForRule( attrValues, - ImmutableSet.of(), + IgnoredSubdirectories.EMPTY, ImmutableMap.of("FOO", "BAR"), StarlarkSemantics.builder() .setBool(BuildLanguageOptions.EXPERIMENTAL_REPO_REMOTE_EXEC, true) diff --git a/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java b/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java index 046908525c9a3f..f5ef62433665e5 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java @@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.ThreadStateReceiver; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.packages.Globber.BadGlobException; import com.google.devtools.build.lib.testutil.Scratch; @@ -109,7 +110,7 @@ private void createCache(PathFragment... ignoredDirectories) { new GlobCache( packageDirectory, PackageIdentifier.createInMainRepo("isolated"), - ImmutableSet.copyOf(ignoredDirectories), + IgnoredSubdirectories.of(ImmutableSet.copyOf(ignoredDirectories)), new CachingPackageLocator() { @Override public Path getBuildFileForPackage(PackageIdentifier packageId) { diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java index 42de75e40fa1d4..e0e33c60dca0d5 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/PackageFactoryTest.java @@ -20,11 +20,11 @@ import static org.junit.Assert.fail; 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.actions.ThreadStateReceiver; import com.google.devtools.build.lib.analysis.config.FeatureSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; @@ -1880,7 +1880,7 @@ private static void assertGlob( new GlobCache( pkg.getFilename().asPath().getParentDirectory(), pkg.getPackageIdentifier(), - ImmutableSet.of(), + IgnoredSubdirectories.EMPTY, // a package locator that finds no packages new CachingPackageLocator() { @Override diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java index 2cc92ee09a3738..e8398d9a1ed875 100644 --- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java +++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java @@ -20,7 +20,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.EventBus; import com.google.devtools.build.lib.actions.ActionKeyContext; import com.google.devtools.build.lib.analysis.BlazeDirectories; @@ -28,6 +27,7 @@ import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction; import com.google.devtools.build.lib.clock.BlazeClock; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.packages.NoSuchPackageException; @@ -424,7 +424,7 @@ private class ManualDiffAwarenessFactory implements DiffAwareness.Factory { @Nullable @Override public DiffAwareness maybeCreate( - Root pathEntry, ImmutableSet ignoredPaths, OptionsProvider optionsProvider) { + Root pathEntry, IgnoredSubdirectories ignoredPaths, OptionsProvider optionsProvider) { return pathEntry.asPath().equals(workspace) ? new ManualDiffAwareness() : null; } } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java index 7708a495908483..d15d9d898530d3 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.bugreport.BugReporter; import com.google.devtools.build.lib.clock.BlazeClock; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.EventCollector; import com.google.devtools.build.lib.events.Reporter; @@ -351,7 +352,7 @@ private CollectPackagesUnderDirectoryValue getCollectPackagesUnderDirectoryValue String directory, ImmutableSet excludedPaths) throws InterruptedException { SkyKey key = CollectPackagesUnderDirectoryValue.key( - RepositoryName.MAIN, rootedPath(directory), excludedPaths); + RepositoryName.MAIN, rootedPath(directory), IgnoredSubdirectories.of(excludedPaths)); return evaluate(key).get(key); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD index 4c0769a97c4825..23f2767f30ee67 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD @@ -163,6 +163,7 @@ java_test( # Windows. tags = ["no_windows"], deps = [ + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/skyframe:broken_diff_awareness_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:diff_awareness", "//src/main/java/com/google/devtools/build/lib/skyframe:local_diff_awareness", @@ -2122,6 +2123,7 @@ java_test( timeout = "short", srcs = ["DiffAwarenessManagerTest.java"], deps = [ + "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/skyframe:broken_diff_awareness_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:diff_awareness", "//src/main/java/com/google/devtools/build/lib/skyframe:diff_awareness_manager", diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java index 741156747fe13d..aa0c966fcd39af 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/DiffAwarenessManagerTest.java @@ -25,13 +25,13 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.events.util.EventCollectionApparatus; import com.google.devtools.build.lib.skyframe.DiffAwareness.View; import com.google.devtools.build.lib.skyframe.DiffAwarenessManager.ProcessableModifiedFileSet; import com.google.devtools.build.lib.vfs.DigestHashFunction; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.ModifiedFileSet; -import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem; @@ -72,7 +72,11 @@ public void testEverythingModifiedIfNoDiffAwareness() throws Exception { assertWithMessage("Expected EVERYTHING_MODIFIED since there are no factories") .that( manager - .getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY) + .getDiff( + events.reporter(), + pathEntry, + IgnoredSubdirectories.EMPTY, + OptionsProvider.EMPTY) .getModifiedFileSet()) .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED); events.assertNoWarningsOrErrors(); @@ -88,7 +92,8 @@ public void testResetAndSetPathEntriesCallClose() throws Exception { factory.inject(pathEntry, diffAwareness1); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); var unused = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertWithMessage("diffAwareness1 shouldn't have been closed yet") .that(diffAwareness1.closed()) .isFalse(); @@ -98,7 +103,8 @@ public void testResetAndSetPathEntriesCallClose() throws Exception { .isTrue(); factory.inject(pathEntry, diffAwareness2); unused = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertWithMessage("diffAwareness2 shouldn't have been closed yet") .that(diffAwareness2.closed()) .isFalse(); @@ -117,24 +123,29 @@ public void testHandlesUnprocessedDiffs() throws Exception { factory.inject(pathEntry, diffAwareness); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); ProcessableModifiedFileSet firstProcessableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff") .that(firstProcessableDiff.getModifiedFileSet()) .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED); firstProcessableDiff.markProcessed(); ProcessableModifiedFileSet processableDiff1 = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(processableDiff1.getModifiedFileSet()).isEqualTo(diff1); ProcessableModifiedFileSet processableDiff2 = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(processableDiff2.getModifiedFileSet()).isEqualTo(modifiedFileSet("file1", "file2")); processableDiff2.markProcessed(); ProcessableModifiedFileSet processableDiff3 = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(processableDiff3.getModifiedFileSet()).isEqualTo(diff3); events.assertNoWarningsOrErrors(); ProcessableModifiedFileSet processableDiff4 = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(processableDiff4.getModifiedFileSet()) .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED); events.assertContainsWarning("error"); @@ -159,7 +170,8 @@ public void testHandlesBrokenDiffs() throws Exception { new DiffAwarenessManager(ImmutableList.of(factory1, factory2, factory3)); ProcessableModifiedFileSet processableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); events.assertNoWarningsOrErrors(); assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness1") .that(processableDiff.getModifiedFileSet()) @@ -167,7 +179,8 @@ public void testHandlesBrokenDiffs() throws Exception { processableDiff.markProcessed(); processableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); events.assertContainsEventWithFrequency("error in getCurrentView", 1); assertWithMessage("Expected EVERYTHING_MODIFIED because of broken getCurrentView") .that(processableDiff.getModifiedFileSet()) @@ -176,19 +189,22 @@ public void testHandlesBrokenDiffs() throws Exception { factory1.remove(pathEntry); processableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness2") .that(processableDiff.getModifiedFileSet()) .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED); processableDiff.markProcessed(); processableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(processableDiff.getModifiedFileSet()).isEqualTo(diff2); processableDiff.markProcessed(); processableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); events.assertContainsEventWithFrequency("error in getDiff", 1); assertWithMessage("Expected EVERYTHING_MODIFIED because of broken getDiff") .that(processableDiff.getModifiedFileSet()) @@ -197,14 +213,16 @@ public void testHandlesBrokenDiffs() throws Exception { factory2.remove(pathEntry); processableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertWithMessage("Expected EVERYTHING_MODIFIED on first call to getDiff for diffAwareness3") .that(processableDiff.getModifiedFileSet()) .isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED); processableDiff.markProcessed(); processableDiff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(processableDiff.getModifiedFileSet()).isEqualTo(diff3); processableDiff.markProcessed(); } @@ -215,16 +233,20 @@ public void testIndependentAwarenessPerIgnoredPaths() throws Exception { DiffAwareness.Factory factory = mock(DiffAwareness.Factory.class); - ModifiedFileSet diff1 = modifiedFileSet("/path/ignored-path-2/foo"); + ModifiedFileSet diff1 = modifiedFileSet("path/ignored-path-2/foo"); DiffAwareness diffAwareness1 = new DiffAwarenessStub(ImmutableList.of(diff1)); when(factory.maybeCreate( - pathEntry, ImmutableSet.of(fs.getPath("/path/ignored-path-1")), OptionsProvider.EMPTY)) + pathEntry, + IgnoredSubdirectories.of(ImmutableSet.of(PathFragment.create("path/ignored-path-1"))), + OptionsProvider.EMPTY)) .thenReturn(diffAwareness1); - ModifiedFileSet diff2 = modifiedFileSet("/path/ignored-path-1/foo"); + ModifiedFileSet diff2 = modifiedFileSet("path/ignored-path-1/foo"); DiffAwareness diffAwareness2 = new DiffAwarenessStub(ImmutableList.of(diff2)); when(factory.maybeCreate( - pathEntry, ImmutableSet.of(fs.getPath("/path/ignored-path-2")), OptionsProvider.EMPTY)) + pathEntry, + IgnoredSubdirectories.of(ImmutableSet.of(PathFragment.create("path/ignored-path-2"))), + OptionsProvider.EMPTY)) .thenReturn(diffAwareness2); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); @@ -233,7 +255,7 @@ public void testIndependentAwarenessPerIgnoredPaths() throws Exception { manager.getDiff( events.reporter(), pathEntry, - ImmutableSet.of(fs.getPath("/path/ignored-path-1")), + IgnoredSubdirectories.of(ImmutableSet.of(PathFragment.create("path/ignored-path-1"))), OptionsProvider.EMPTY); processedDiff1.markProcessed(); assertThat(processedDiff1.getModifiedFileSet()).isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED); @@ -241,7 +263,7 @@ public void testIndependentAwarenessPerIgnoredPaths() throws Exception { manager.getDiff( events.reporter(), pathEntry, - ImmutableSet.of(fs.getPath("/path/ignored-path-1")), + IgnoredSubdirectories.of(ImmutableSet.of(PathFragment.create("path/ignored-path-1"))), OptionsProvider.EMPTY); processedDiff1.markProcessed(); assertThat(processedDiff1.getModifiedFileSet()).isEqualTo(diff1); @@ -250,7 +272,7 @@ public void testIndependentAwarenessPerIgnoredPaths() throws Exception { manager.getDiff( events.reporter(), pathEntry, - ImmutableSet.of(fs.getPath("/path/ignored-path-2")), + IgnoredSubdirectories.of(ImmutableSet.of(PathFragment.create("path/ignored-path-2"))), OptionsProvider.EMPTY); processedDiff2.markProcessed(); assertThat(processedDiff2.getModifiedFileSet()).isEqualTo(ModifiedFileSet.EVERYTHING_MODIFIED); @@ -258,7 +280,7 @@ public void testIndependentAwarenessPerIgnoredPaths() throws Exception { manager.getDiff( events.reporter(), pathEntry, - ImmutableSet.of(fs.getPath("/path/ignored-path-2")), + IgnoredSubdirectories.of(ImmutableSet.of(PathFragment.create("path/ignored-path-2"))), OptionsProvider.EMPTY); processedDiff2.markProcessed(); assertThat(processedDiff2.getModifiedFileSet()).isEqualTo(diff2); @@ -271,12 +293,13 @@ public void getDiff_cleanBuild_propagatesWorkspaceInfo() throws Exception { DiffAwareness diffAwareness = mock(DiffAwareness.class); when(diffAwareness.getCurrentView(any())).thenReturn(createView(workspaceInfo)); DiffAwareness.Factory factory = mock(DiffAwareness.Factory.class); - when(factory.maybeCreate(pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY)) + when(factory.maybeCreate(pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY)) .thenReturn(diffAwareness); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); ProcessableModifiedFileSet diff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(diff.getWorkspaceInfo()).isSameInstanceAs(workspaceInfo); } @@ -293,14 +316,16 @@ public void getDiff_incrementalBuild_propagatesLatestWorkspaceInfo() throws Exce when(diffAwareness.getDiff(view1, view2)) .thenReturn(ModifiedFileSet.builder().modify(PathFragment.create("file")).build()); DiffAwareness.Factory factory = mock(DiffAwareness.Factory.class); - when(factory.maybeCreate(pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY)) + when(factory.maybeCreate(pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY)) .thenReturn(diffAwareness); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); var unused = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); ProcessableModifiedFileSet diff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(diff.getWorkspaceInfo()).isSameInstanceAs(workspaceInfo2); } @@ -316,14 +341,16 @@ public void getDiff_incrementalBuildNoChange_propagatesNewWorkspaceInfo() throws when(diffAwareness.getCurrentView(any())).thenReturn(view1, view2); when(diffAwareness.getDiff(view1, view2)).thenReturn(ModifiedFileSet.NOTHING_MODIFIED); DiffAwareness.Factory factory = mock(DiffAwareness.Factory.class); - when(factory.maybeCreate(pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY)) + when(factory.maybeCreate(pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY)) .thenReturn(diffAwareness); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); var unused = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); ProcessableModifiedFileSet diff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(diff.getWorkspaceInfo()).isSameInstanceAs(workspaceInfo2); } @@ -339,14 +366,16 @@ public void getDiff_incrementalBuildWithNoWorkspaceInfo_returnsDiffWithNullWorks when(diffAwareness.getDiff(view1, view2)) .thenReturn(ModifiedFileSet.builder().modify(PathFragment.create("file")).build()); DiffAwareness.Factory factory = mock(DiffAwareness.Factory.class); - when(factory.maybeCreate(pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY)) + when(factory.maybeCreate(pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY)) .thenReturn(diffAwareness); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); var unused = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); ProcessableModifiedFileSet diff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(diff.getWorkspaceInfo()).isNull(); } @@ -362,15 +391,17 @@ public void getDiff_brokenDiffAwareness_returnsDiffWithNullWorkspaceInfo() throw when(diffAwareness.getCurrentView(any())).thenReturn(view1, view2); when(diffAwareness.getDiff(view1, view2)).thenThrow(BrokenDiffAwarenessException.class); DiffAwareness.Factory factory = mock(DiffAwareness.Factory.class); - when(factory.maybeCreate(pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY)) + when(factory.maybeCreate(pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY)) .thenReturn(diffAwareness); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); var diff1 = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); diff1.markProcessed(); ProcessableModifiedFileSet diff = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); assertThat(diff.getWorkspaceInfo()).isNull(); } @@ -384,18 +415,19 @@ public void getDiff_incompatibleDiff_fails() throws Exception { when(diffAwareness.getCurrentView(any())).thenReturn(view1, view2); when(diffAwareness.getDiff(view1, view2)).thenThrow(IncompatibleViewException.class); DiffAwareness.Factory factory = mock(DiffAwareness.Factory.class); - when(factory.maybeCreate(pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY)) + when(factory.maybeCreate(pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY)) .thenReturn(diffAwareness); DiffAwarenessManager manager = new DiffAwarenessManager(ImmutableList.of(factory)); var diff1 = - manager.getDiff(events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY); + manager.getDiff( + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY); diff1.markProcessed(); assertThrows( IllegalStateException.class, () -> manager.getDiff( - events.reporter(), pathEntry, ImmutableSet.of(), OptionsProvider.EMPTY)); + events.reporter(), pathEntry, IgnoredSubdirectories.EMPTY, OptionsProvider.EMPTY)); } private static View createView(@Nullable WorkspaceInfoFromDiff workspaceInfo) { @@ -423,7 +455,7 @@ public void remove(Root pathEntry) { @Override @Nullable public DiffAwareness maybeCreate( - Root pathEntry, ImmutableSet ignoredPaths, OptionsProvider optionsProvider) { + Root pathEntry, IgnoredSubdirectories ignoredPaths, OptionsProvider optionsProvider) { return diffAwarenesses.get(pathEntry); } } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/LocalDiffAwarenessTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/LocalDiffAwarenessTest.java index 729fa577213099..82b82cb21e5e68 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/LocalDiffAwarenessTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/LocalDiffAwarenessTest.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.devtools.build.lib.buildtool.util.BuildIntegrationTestCase; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.skyframe.DiffAwareness.View; import com.google.devtools.build.lib.skyframe.LocalDiffAwareness.SequentialView; import com.google.devtools.build.lib.testing.common.FakeOptions; @@ -78,7 +79,8 @@ public final void initializeSettings() throws Exception { (LocalDiffAwareness) factory.maybeCreate( Root.fromPath(testCaseRoot), - ImmutableSet.of(testCaseIgnoredDir), + IgnoredSubdirectories.of( + ImmutableSet.of(testCaseIgnoredDir.asFragment().toRelative())), watchFsEnabledProvider); // Ignore test failures when run on a Mac. diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java index 801f5b5030f429..76e259df8d139a 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunctionTest.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.io.InconsistentFilesystemException; @@ -81,7 +82,7 @@ private static SkyKey createCollectPackagesKey( Path root, PathFragment rootRelativePath, ImmutableSet excludedPaths) { RootedPath rootedPath = RootedPath.toRootedPath(Root.fromPath(root), rootRelativePath); return CollectPackagesUnderDirectoryValue.key( - RepositoryName.MAIN, rootedPath, excludedPaths); + RepositoryName.MAIN, rootedPath, IgnoredSubdirectories.of(excludedPaths)); } private static SkyKey createPrepDepsKey(Path root, PathFragment rootRelativePath) { @@ -92,13 +93,13 @@ private static SkyKey createPrepDepsKey( Path root, PathFragment rootRelativePath, ImmutableSet excludedPaths) { RootedPath rootedPath = RootedPath.toRootedPath(Root.fromPath(root), rootRelativePath); return PrepareDepsOfTargetsUnderDirectoryValue.key( - RepositoryName.MAIN, rootedPath, excludedPaths); + RepositoryName.MAIN, rootedPath, IgnoredSubdirectories.of(excludedPaths)); } private static SkyKey createPrepDepsKey( Path root, PathFragment rootRelativePath, - ImmutableSet excludedPaths, + IgnoredSubdirectories excludedPaths, FilteringPolicy filteringPolicy) { RootedPath rootedPath = RootedPath.toRootedPath(Root.fromPath(root), rootRelativePath); return PrepareDepsOfTargetsUnderDirectoryValue.key( @@ -159,7 +160,7 @@ public void testTargetFilterSensitivity() throws Exception { createPrepDepsKey( rootDirectory, PathFragment.create("a"), - ImmutableSet.of(), + IgnoredSubdirectories.EMPTY, FilteringPolicies.FILTER_TESTS); EvaluationResult evaluationResult = getAndCheckEvaluationResult(key); WalkableGraph graph = Preconditions.checkNotNull(evaluationResult.getWalkableGraph()); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryKeyCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryKeyCodecTest.java index 523776d9fcc2ee..1afee80f613c85 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryKeyCodecTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryKeyCodecTest.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; import com.google.devtools.build.lib.skyframe.PrepareDepsOfTargetsUnderDirectoryValue.PrepareDepsOfTargetsUnderDirectoryKey; @@ -35,7 +36,7 @@ public void testCodec() throws Exception { new RecursivePkgKey( RepositoryName.MAIN, FsUtils.TEST_ROOTED_PATH, - ImmutableSet.of(FsUtils.rootPathRelative("here"))), + IgnoredSubdirectories.of(ImmutableSet.of(FsUtils.rootPathRelative("here")))), FilteringPolicies.and( FilteringPolicies.NO_FILTER, FilteringPolicies.FILTER_TESTS))); FsUtils.addDependencies(serializationTester); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java index 4feec5fc1311f7..8cb11db38fac07 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunctionTest.java @@ -20,6 +20,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -49,7 +50,7 @@ private static SkyKey buildRecursivePkgKey( Path root, PathFragment rootRelativePath, ImmutableSet excludedPaths) { RootedPath rootedPath = RootedPath.toRootedPath(Root.fromPath(root), rootRelativePath); return RecursivePkgValue.key( - RepositoryName.MAIN, rootedPath, excludedPaths); + RepositoryName.MAIN, rootedPath, IgnoredSubdirectories.of(excludedPaths)); } private RecursivePkgValue buildRecursivePkgValue(Path root, PathFragment rootRelativePath) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java index b09718838f9711..461d0f5b01962c 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursivePkgKeyTest.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; @@ -35,7 +36,7 @@ private SkyKey buildRecursivePkgKey( PathFragment rootRelativePath, ImmutableSet excludedPaths) { RootedPath rootedPath = RootedPath.toRootedPath(Root.fromPath(rootDirectory), rootRelativePath); - return RecursivePkgValue.key(repository, rootedPath, excludedPaths); + return RecursivePkgValue.key(repository, rootedPath, IgnoredSubdirectories.of(excludedPaths)); } private void invalidHelper( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/IgnoredPackagePrefixesValueCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/IgnoredPackagePrefixesValueCodecTest.java index 99eb9dd23de8ab..dc04ba9babd67c 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/IgnoredPackagePrefixesValueCodecTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/IgnoredPackagePrefixesValueCodecTest.java @@ -29,9 +29,9 @@ public class IgnoredPackagePrefixesValueCodecTest { public void testCodec() throws Exception { new SerializationTester( IgnoredPackagePrefixesValue.of(ImmutableSet.of()), - IgnoredPackagePrefixesValue.of(ImmutableSet.of(PathFragment.create("/foo"))), + IgnoredPackagePrefixesValue.of(ImmutableSet.of(PathFragment.create("foo"))), IgnoredPackagePrefixesValue.of( - ImmutableSet.of(PathFragment.create("/foo"), PathFragment.create("/bar/moo")))) + ImmutableSet.of(PathFragment.create("foo"), PathFragment.create("bar/moo")))) .runTests(); } } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RecursivePkgKeyCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RecursivePkgKeyCodecTest.java index 4cc867f50e9cda..89e2c030273180 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RecursivePkgKeyCodecTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/RecursivePkgKeyCodecTest.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe.serialization; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.IgnoredSubdirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.skyframe.RecursivePkgKey; import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils; @@ -30,12 +31,14 @@ public class RecursivePkgKeyCodecTest { public void testCodec() throws Exception { SerializationTester serializationTester = new SerializationTester( - new RecursivePkgKey(RepositoryName.MAIN, FsUtils.TEST_ROOTED_PATH, ImmutableSet.of()), + new RecursivePkgKey( + RepositoryName.MAIN, FsUtils.TEST_ROOTED_PATH, IgnoredSubdirectories.EMPTY), new RecursivePkgKey( RepositoryName.MAIN, FsUtils.TEST_ROOTED_PATH, - ImmutableSet.of( - FsUtils.rootPathRelative("here"), FsUtils.rootPathRelative("there")))); + IgnoredSubdirectories.of( + ImmutableSet.of( + FsUtils.rootPathRelative("here"), FsUtils.rootPathRelative("there"))))); FsUtils.addDependencies(serializationTester); serializationTester.runTests(); }