Inside findTargetsBeneathDirectory(), invoke the callback with all targets from the current package batch. -- MOS_MIGRATED_REVID=111858978
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 2641056..21c9482 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
@@ -13,6 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import static com.google.devtools.build.lib.pkgcache.FilteringPolicies.NO_FILTER; + import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -190,10 +192,11 @@ // into batches. for (Iterable<PackageIdentifier> pkgIdBatch : Iterables.partition(pkgIds, MAX_PACKAGES_BULK_GET)) { - for (ResolvedTargets<Target> targets : - bulkGetTargetsInPackage(originalPattern, pkgIdBatch, FilteringPolicies.NO_FILTER) - .values()) { - List<Target> filteredTargets = new ArrayList<>(targets.getTargets().size()); + + Iterable<ResolvedTargets<Target>> resolvedTargets = + bulkGetTargetsInPackage(originalPattern, pkgIdBatch, NO_FILTER).values(); + List<Target> filteredTargets = new ArrayList<>(calculateSize(resolvedTargets)); + for (ResolvedTargets<Target> targets : resolvedTargets) { for (Target target : targets.getTargets()) { // Perform the no-targets-found check before applying the filtering policy so we only // return the error if the input directory's subtree really contains no targets. @@ -202,13 +205,21 @@ filteredTargets.add(target); } } - callback.process(filteredTargets); } + callback.process(filteredTargets); } if (!foundTarget) { throw new TargetParsingException("no targets found beneath '" + pathFragment + "'"); } } + + private static <T> int calculateSize(Iterable<ResolvedTargets<T>> resolvedTargets) { + int size = 0; + for (ResolvedTargets<T> targets : resolvedTargets) { + size += targets.getTargets().size(); + } + return size; + } }