From 5e9ce943bf24fef5e95231f2507344ea24f5c732 Mon Sep 17 00:00:00 2001 From: John Cater Date: Wed, 12 Oct 2016 17:23:30 +0000 Subject: Adds an enum to describe how PackageLookupFunction should handle package labels which cross into a sub-repository. Part of #1592. -- MOS_MIGRATED_REVID=135931868 --- .../build/lib/skyframe/PackageLookupFunction.java | 22 +++++++++++++++++++--- .../lib/skyframe/SequencedSkyframeExecutor.java | 22 +++++++++++++++------- .../skyframe/SequencedSkyframeExecutorFactory.java | 4 +++- .../build/lib/skyframe/SkyframeExecutor.java | 11 +++++++++-- 4 files changed, 46 insertions(+), 13 deletions(-) (limited to 'src/main/java/com/google/devtools/build') 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 6e425e8dd7..8654501138 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 @@ -39,11 +39,22 @@ import javax.annotation.Nullable; * SkyFunction for {@link PackageLookupValue}s. */ public class PackageLookupFunction implements SkyFunction { + /** Lists possible ways to handle a package label which crosses into a new repository. */ + public enum CrossRepositoryLabelViolationStrategy { + /** Ignore the violation. */ + IGNORE, + /** Generate an error. */ + ERROR; + } private final AtomicReference> deletedPackages; + private final CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy; - public PackageLookupFunction(AtomicReference> deletedPackages) { + public PackageLookupFunction( + AtomicReference> deletedPackages, + CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy) { this.deletedPackages = deletedPackages; + this.crossRepositoryLabelViolationStrategy = crossRepositoryLabelViolationStrategy; } @Override @@ -123,7 +134,7 @@ public class PackageLookupFunction implements SkyFunction { return fileValue; } - private static PackageLookupValue getPackageLookupValue( + private PackageLookupValue getPackageLookupValue( Environment env, ImmutableList packagePathEntries, PackageIdentifier packageIdentifier, @@ -137,6 +148,11 @@ public class PackageLookupFunction implements SkyFunction { PathFragment buildFileFragment = buildFileName.getBuildFileFragment(packageIdentifier); RootedPath buildFileRootedPath = RootedPath.toRootedPath(packagePathEntry, buildFileFragment); + + if (crossRepositoryLabelViolationStrategy != CrossRepositoryLabelViolationStrategy.IGNORE) { + // TODO(jcater): Check for cross repository package label violations. + } + FileValue fileValue = getFileValue(buildFileRootedPath, env, packageIdentifier); if (fileValue == null) { return null; @@ -148,7 +164,7 @@ public class PackageLookupFunction implements SkyFunction { return PackageLookupValue.NO_BUILD_FILE_VALUE; } - private static PackageLookupValue computeWorkspacePackageLookupValue( + private PackageLookupValue computeWorkspacePackageLookupValue( Environment env, ImmutableList packagePathEntries) throws PackageLookupFunctionException, InterruptedException { PackageLookupValue result = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java index bda49c2284..03f0b34ed9 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java @@ -46,6 +46,7 @@ import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.MissingDiffD import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.UnionDirtinessChecker; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFilesKnowledge; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.FileType; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.util.AbruptExitException; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.util.Preconditions; @@ -108,7 +109,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { ImmutableList extraPrecomputedValues, Iterable customDirtinessCheckers, PathFragment blacklistedPackagePrefixesFile, - String productName) { + String productName, + CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy) { super( evaluatorSupplier, pkgFactory, @@ -122,7 +124,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { extraPrecomputedValues, false, blacklistedPackagePrefixesFile, - productName); + productName, + crossRepositoryLabelViolationStrategy); this.diffAwarenessManager = new DiffAwarenessManager(diffAwarenessFactories); this.customDirtinessCheckers = customDirtinessCheckers; } @@ -139,7 +142,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { ImmutableMap extraSkyFunctions, ImmutableList extraPrecomputedValues, Iterable customDirtinessCheckers, - String productName) { + String productName, + CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy) { return create( pkgFactory, directories, @@ -153,7 +157,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { extraPrecomputedValues, customDirtinessCheckers, /*blacklistedPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT, - productName); + productName, + crossRepositoryLabelViolationStrategy); } private static SequencedSkyframeExecutor create( @@ -169,7 +174,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { ImmutableList extraPrecomputedValues, Iterable customDirtinessCheckers, PathFragment blacklistedPackagePrefixesFile, - String productName) { + String productName, + CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy) { SequencedSkyframeExecutor skyframeExecutor = new SequencedSkyframeExecutor( InMemoryMemoizingEvaluator.SUPPLIER, @@ -185,7 +191,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { extraPrecomputedValues, customDirtinessCheckers, blacklistedPackagePrefixesFile, - productName); + productName, + crossRepositoryLabelViolationStrategy); skyframeExecutor.init(); return skyframeExecutor; } @@ -211,7 +218,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { ImmutableList.of(), ImmutableList.of(), blacklistedPackagePrefixesFile, - productName); + productName, + CrossRepositoryLabelViolationStrategy.ERROR); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java index 6ae70ff3ed..1e3b046738 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorFactory.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; import com.google.devtools.build.lib.analysis.config.BinTools; import com.google.devtools.build.lib.packages.PackageFactory; import com.google.devtools.build.lib.packages.Preprocessor; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; @@ -57,6 +58,7 @@ public class SequencedSkyframeExecutorFactory implements SkyframeExecutorFactory extraSkyFunctions, extraPrecomputedValues, customDirtinessCheckers, - productName); + productName, + CrossRepositoryLabelViolationStrategy.ERROR); } } 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 93e3323f20..c0d157aa7c 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 @@ -106,6 +106,7 @@ import com.google.devtools.build.lib.profiler.AutoProfiler; import com.google.devtools.build.lib.skyframe.AspectValue.AspectValueKey; import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.FileDirtinessChecker; import com.google.devtools.build.lib.skyframe.PackageFunction.CacheEntryWithGlobDeps; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier; import com.google.devtools.build.lib.util.AbruptExitException; @@ -271,6 +272,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { private final RuleClassProvider ruleClassProvider; + private final CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy; + private static final Logger LOG = Logger.getLogger(SkyframeExecutor.class.getName()); protected SkyframeExecutor( @@ -286,7 +289,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { ImmutableList extraPrecomputedValues, boolean errorOnExternalFiles, PathFragment blacklistedPackagePrefixesFile, - String productName) { + String productName, + CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy) { // Strictly speaking, these arguments are not required for initialization, but all current // callsites have them at hand, so we might as well set them during construction. this.evaluatorSupplier = evaluatorSupplier; @@ -319,6 +323,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { this.externalFilesHelper = new ExternalFilesHelper( pkgLocator, this.errorOnExternalFiles, directories); this.productName = productName; + this.crossRepositoryLabelViolationStrategy = crossRepositoryLabelViolationStrategy; } private ImmutableMap skyFunctions( @@ -340,7 +345,9 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { new FileSymlinkInfiniteExpansionUniquenessFunction()); map.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); map.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); - map.put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(deletedPackages)); + map.put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(deletedPackages, crossRepositoryLabelViolationStrategy)); map.put(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, new ContainingPackageLookupFunction()); map.put(SkyFunctions.AST_FILE_LOOKUP, new ASTFileLookupFunction(ruleClassProvider)); map.put( -- cgit v1.2.3