diff options
author | Ulf Adams <ulfjack@google.com> | 2016-11-22 11:33:11 +0000 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2016-11-22 14:15:03 +0000 |
commit | 4ca26422de9733a140d1e5c91aaee8a9aba6644d (patch) | |
tree | cad66a37d30caca9a43a361bcacc609cfad3f842 /src/main/java/com/google/devtools/build/lib/pkgcache | |
parent | cefa9a2059237f76610273500b3be308490e1e68 (diff) |
Refactor LegacyLoadingPhaseRunner to be more like SkyframeLoadingPhaseRunner.
This is in preparation for extracting some common reporting code, and also a
step towards interleaving target pattern eval and config creation.
--
MOS_MIGRATED_REVID=139890205
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/pkgcache')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java | 308 |
1 files changed, 0 insertions, 308 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java b/src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java deleted file mode 100644 index 018e03208d..0000000000 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright 2014 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.pkgcache; - -import com.google.common.base.Stopwatch; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; -import com.google.common.eventbus.EventBus; -import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.cmdline.ResolvedTargets; -import com.google.devtools.build.lib.cmdline.TargetParsingException; -import com.google.devtools.build.lib.events.DelegatingEventHandler; -import com.google.devtools.build.lib.events.Event; -import com.google.devtools.build.lib.events.EventHandler; -import com.google.devtools.build.lib.packages.NoSuchPackageException; -import com.google.devtools.build.lib.packages.Target; -import com.google.devtools.build.lib.packages.TargetUtils; -import com.google.devtools.build.lib.packages.TestTargetUtils; -import com.google.devtools.build.lib.util.Preconditions; -import com.google.devtools.build.lib.vfs.PathFragment; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; -import javax.annotation.Nullable; - -/** - * Implements the loading phase; responsible for: - * <ul> - * <li>target pattern evaluation - * <li>test suite expansion - * <li>loading the labels needed to construct the build configuration - * <li>loading the labels needed for the analysis with the build configuration - * <li>loading the transitive closure of the targets and the configuration labels - * </ul> - * - * <p>In order to ensure correctness of incremental loading and of full cache hits, this class is - * very restrictive about access to its internal state and to its collaborators. In particular, none - * of the collaborators of this class may change in incompatible ways, such as changing the relative - * working directory for the target pattern parser, without notifying this class. - * - * <p>For full caching, this class tracks the exact values of all inputs to the loading phase. To - * maximize caching, it is vital that these change as rarely as possible. - * - * <p>The Skyframe-based re-implementation of this class is in TargetPatternPhaseFunction. - */ -public final class LegacyLoadingPhaseRunner extends LoadingPhaseRunner { - - private static final class ParseFailureListenerImpl extends DelegatingEventHandler - implements ParseFailureListener { - private final EventBus eventBus; - - private ParseFailureListenerImpl(EventHandler delegate, EventBus eventBus) { - super(delegate); - this.eventBus = eventBus; - } - - @Override - public void parsingError(String targetPattern, String message) { - if (eventBus != null) { - eventBus.post(new ParsingFailedEvent(targetPattern, message)); - } - } - } - - private static final Logger LOG = Logger.getLogger(LoadingPhaseRunner.class.getName()); - - private final PackageManager packageManager; - private final TargetPatternEvaluator targetPatternEvaluator; - private final Set<String> ruleNames; - - public LegacyLoadingPhaseRunner(PackageManager packageManager, - Set<String> ruleNames) { - this.packageManager = packageManager; - this.targetPatternEvaluator = packageManager.newTargetPatternEvaluator(); - this.ruleNames = ruleNames; - } - - /** - * Performs target pattern evaluation, test suite expansion (if requested), and loads the - * transitive closure of the resulting targets as well as of the targets needed to use the given - * build configuration provider. - */ - @Override - public LoadingResult execute( - EventHandler eventHandler, - EventBus eventBus, - List<String> targetPatterns, - PathFragment relativeWorkingDirectory, - LoadingOptions options, - boolean keepGoing, - boolean determineTests, - @Nullable LoadingCallback callback) - throws TargetParsingException, LoadingFailedException, InterruptedException { - LOG.info("Starting pattern evaluation"); - Stopwatch timer = Stopwatch.createStarted(); - if (options.buildTestsOnly && options.compileOneDependency) { - throw new LoadingFailedException("--compile_one_dependency cannot be used together with " - + "the --build_tests_only option or the 'bazel test' command "); - } - - targetPatternEvaluator.updateOffset(relativeWorkingDirectory); - EventHandler parseFailureListener = new ParseFailureListenerImpl(eventHandler, eventBus); - // Determine targets to build: - ResolvedTargets<Target> targets = getTargetsToBuild(parseFailureListener, - targetPatterns, options.compileOneDependency, options.buildTagFilterList, keepGoing); - - ImmutableSet<Target> filteredTargets = targets.getFilteredTargets(); - - boolean buildTestsOnly = options.buildTestsOnly; - ImmutableSet<Target> testsToRun = null; - ImmutableSet<Target> testFilteredTargets = ImmutableSet.of(); - - // Now we have a list of targets to build. If the --build_tests_only option was specified or we - // want to run tests, we need to determine the list of targets to test. For that, we remove - // manual tests and apply the command line filters. Also, if --build_tests_only is specified, - // then the list of filtered targets will be set as build list as well. - if (determineTests || buildTestsOnly) { - // Parse the targets to get the tests. - ResolvedTargets<Target> testTargets = determineTests(parseFailureListener, - targetPatterns, options, keepGoing); - if (testTargets.getTargets().isEmpty() && !testTargets.getFilteredTargets().isEmpty()) { - eventHandler.handle(Event.warn("All specified test targets were excluded by filters")); - } - - if (buildTestsOnly) { - // Replace original targets to build with test targets, so that only targets that are - // actually going to be built are loaded in the loading phase. Note that this has a side - // effect that any test_suite target requested to be built is replaced by the set of *_test - // targets it represents; for example, this affects the status and the summary reports. - Set<Target> allFilteredTargets = new HashSet<>(); - allFilteredTargets.addAll(targets.getTargets()); - allFilteredTargets.addAll(targets.getFilteredTargets()); - allFilteredTargets.removeAll(testTargets.getTargets()); - allFilteredTargets.addAll(testTargets.getFilteredTargets()); - testFilteredTargets = ImmutableSet.copyOf(allFilteredTargets); - filteredTargets = ImmutableSet.of(); - - targets = ResolvedTargets.<Target>builder() - .merge(testTargets) - .mergeError(targets.hasError()) - .build(); - if (determineTests) { - testsToRun = testTargets.getTargets(); - } - } else /*if (determineTests)*/ { - testsToRun = testTargets.getTargets(); - targets = ResolvedTargets.<Target>builder() - .merge(targets) - // Avoid merge() here which would remove the filteredTargets from the targets. - .addAll(testsToRun) - .mergeError(testTargets.hasError()) - .build(); - // filteredTargets is correct in this case - it cannot contain tests that got back in - // through test_suite expansion, because the test determination would also filter those out. - // However, that's not obvious, and it might be better to explicitly recompute it. - } - if (testsToRun != null) { - // Note that testsToRun can still be null here, if buildTestsOnly && !shouldRunTests. - Preconditions.checkState(targets.getTargets().containsAll(testsToRun)); - } - } - - eventBus.post( - new TargetParsingCompleteEvent( - targets.getTargets(), - filteredTargets, - testFilteredTargets, - timer.stop().elapsed(TimeUnit.MILLISECONDS), - targetPatterns)); - - if (targets.hasError()) { - eventHandler.handle(Event.warn("Target pattern parsing failed. Continuing anyway")); - } - if (callback != null) { - callback.notifyTargets(targets.getTargets()); - } - LoadingPhaseRunner.maybeReportDeprecation(eventHandler, targets.getTargets()); - - return doSimpleLoadingPhase(eventHandler, eventBus, targets, testsToRun, keepGoing); - } - - /** - * Perform test_suite expansion and emits necessary events and logging messages for legacy - * support. - */ - private LoadingResult doSimpleLoadingPhase( - EventHandler eventHandler, - EventBus eventBus, - ResolvedTargets<Target> targets, - ImmutableSet<Target> testsToRun, - boolean keepGoing) - throws InterruptedException, LoadingFailedException { - Stopwatch timer = preLoadingLogging(eventHandler); - - ImmutableSet<Target> targetsToLoad = targets.getTargets(); - ResolvedTargets<Target> expandedResult; - try { - expandedResult = expandTestSuites(eventHandler, targetsToLoad, keepGoing); - } catch (TargetParsingException e) { - throw new LoadingFailedException("Loading failed; build aborted", e); - } - - postLoadingLogging(eventBus, targetsToLoad, expandedResult.getTargets(), timer); - return new LoadingResult(targets.hasError(), expandedResult.hasError(), - expandedResult.getTargets(), testsToRun, getWorkspaceName(eventHandler)); - } - - private Stopwatch preLoadingLogging(EventHandler eventHandler) { - eventHandler.handle(Event.progress("Loading...")); - LOG.info("Starting loading phase"); - return Stopwatch.createStarted(); - } - - private void postLoadingLogging(EventBus eventBus, ImmutableSet<Target> originalTargetsToLoad, - ImmutableSet<Target> expandedTargetsToLoad, Stopwatch timer) { - Set<Target> testSuiteTargets = Sets.difference(originalTargetsToLoad, expandedTargetsToLoad); - eventBus.post(new LoadingPhaseCompleteEvent( - expandedTargetsToLoad, ImmutableSet.copyOf(testSuiteTargets), - packageManager.getStatistics(), timer.stop().elapsed(TimeUnit.MILLISECONDS))); - LOG.info("Loading phase finished"); - } - - private ResolvedTargets<Target> expandTestSuites(EventHandler eventHandler, - ImmutableSet<Target> targets, boolean keepGoing) - throws LoadingFailedException, TargetParsingException { - // We use strict test_suite expansion here to match the analysis-time checks. - ResolvedTargets<Target> expandedResult = TestTargetUtils.expandTestSuites( - packageManager, eventHandler, targets, /*strict=*/true, /*keepGoing=*/true); - if (expandedResult.hasError() && !keepGoing) { - throw new LoadingFailedException("Could not expand test suite target"); - } - return expandedResult; - } - - /** - * Interpret the command-line arguments. - * - * @param targetPatterns the list of command-line target patterns specified by the user - * @param compileOneDependency if true, enables alternative interpretation of targetPatterns; see - * {@link LoadingOptions#compileOneDependency} - * @throws TargetParsingException if parsing failed and !keepGoing - */ - private ResolvedTargets<Target> getTargetsToBuild(EventHandler eventHandler, - List<String> targetPatterns, boolean compileOneDependency, - List<String> buildTagFilterList, boolean keepGoing) - throws TargetParsingException, InterruptedException { - ResolvedTargets<Target> evaluated = - targetPatternEvaluator.parseTargetPatternList(eventHandler, targetPatterns, - FilteringPolicies.FILTER_MANUAL, keepGoing); - - ResolvedTargets<Target> result = ResolvedTargets.<Target>builder() - .merge(evaluated) - .filter(TargetUtils.tagFilter(buildTagFilterList)) - .build(); - - if (compileOneDependency) { - return new CompileOneDependencyTransformer(packageManager) - .transformCompileOneDependency(eventHandler, result); - } - - return result; - } - - /** - * Interpret test target labels from the command-line arguments and return the corresponding set - * of targets, handling the filter flags, and expanding test suites. - * - * @param eventHandler the error event eventHandler - * @param targetPatterns the list of command-line target patterns specified by the user - * @param options the loading phase options - * @param keepGoing value of the --keep_going flag - */ - private ResolvedTargets<Target> determineTests(EventHandler eventHandler, - List<String> targetPatterns, LoadingOptions options, boolean keepGoing) - throws TargetParsingException, InterruptedException { - // Parse the targets to get the tests. - ResolvedTargets<Target> testTargetsBuilder = targetPatternEvaluator.parseTargetPatternList( - eventHandler, targetPatterns, FilteringPolicies.FILTER_TESTS, keepGoing); - - ResolvedTargets.Builder<Target> finalBuilder = ResolvedTargets.builder(); - finalBuilder.merge(testTargetsBuilder); - finalBuilder.filter(TestFilter.forOptions(options, eventHandler, ruleNames)); - return finalBuilder.build(); - } - - private String getWorkspaceName(EventHandler eventHandler) - throws InterruptedException, LoadingFailedException { - try { - return packageManager.getPackage(eventHandler, Label.EXTERNAL_PACKAGE_IDENTIFIER) - .getWorkspaceName(); - } catch (NoSuchPackageException e) { - throw new LoadingFailedException("Failed to load //external package", e); - } - } -} |