diff options
20 files changed, 167 insertions, 79 deletions
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<ImmutableSet<PackageIdentifier>> deletedPackages; + private final CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy; - public PackageLookupFunction(AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages) { + public PackageLookupFunction( + AtomicReference<ImmutableSet<PackageIdentifier>> 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<Path> 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<Path> 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<PrecomputedValue.Injected> extraPrecomputedValues, Iterable<SkyValueDirtinessChecker> 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<SkyFunctionName, SkyFunction> extraSkyFunctions, ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues, Iterable<SkyValueDirtinessChecker> 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<PrecomputedValue.Injected> extraPrecomputedValues, Iterable<SkyValueDirtinessChecker> 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.<PrecomputedValue.Injected>of(), ImmutableList.<SkyValueDirtinessChecker>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<PrecomputedValue.Injected> 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<SkyFunctionName, SkyFunction> 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( diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java index 6fdec64bbf..406b360316 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java @@ -52,6 +52,7 @@ import com.google.devtools.build.lib.pkgcache.PackageManager; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey; import com.google.devtools.build.lib.skyframe.DiffAwareness; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; @@ -177,7 +178,8 @@ public abstract class AnalysisTestCase extends FoundationTestCase { analysisMock.getSkyFunctions(), getPrecomputedValues(), ImmutableList.<SkyValueDirtinessChecker>of(), - analysisMock.getProductName()); + analysisMock.getProductName(), + CrossRepositoryLabelViolationStrategy.ERROR); PackageCacheOptions packageCacheOptions = Options.getDefaults(PackageCacheOptions.class); packageCacheOptions.showLoadingProgress = true; packageCacheOptions.globbingThreads = 3; diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index eeee5b590e..a25b4989cd 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java @@ -122,6 +122,7 @@ import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider; import com.google.devtools.build.lib.skyframe.AspectValue; import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey; import com.google.devtools.build.lib.skyframe.DiffAwareness; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; @@ -224,7 +225,8 @@ public abstract class BuildViewTestCase extends FoundationTestCase { analysisMock.getSkyFunctions(), getPrecomputedValues(), ImmutableList.<SkyValueDirtinessChecker>of(), - analysisMock.getProductName()); + analysisMock.getProductName(), + CrossRepositoryLabelViolationStrategy.ERROR); packageCacheOptions.defaultVisibility = ConstantRuleVisibility.PUBLIC; packageCacheOptions.showLoadingProgress = true; packageCacheOptions.globbingThreads = 7; diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java index cdab315593..66a071ecf2 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.packages.util.MockToolsConfig; import com.google.devtools.build.lib.pkgcache.PackageCacheOptions; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.DiffAwareness; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; @@ -113,7 +114,8 @@ public abstract class ConfigurationTestCase extends FoundationTestCase { analysisMock.getSkyFunctions(), ImmutableList.<PrecomputedValue.Injected>of(), ImmutableList.<SkyValueDirtinessChecker>of(), - analysisMock.getProductName()); + analysisMock.getProductName(), + CrossRepositoryLabelViolationStrategy.ERROR); PackageCacheOptions packageCacheOptions = Options.getDefaults(PackageCacheOptions.class); packageCacheOptions.showLoadingProgress = true; diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java index 812436dbe3..03d8fdf30d 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.pkgcache.PackageCacheOptions; import com.google.devtools.build.lib.pkgcache.PackageManager; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.DiffAwareness; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; @@ -114,7 +115,8 @@ public abstract class PackageLoadingTestCase extends FoundationTestCase { ImmutableMap.<SkyFunctionName, SkyFunction>of(), ImmutableList.<PrecomputedValue.Injected>of(), ImmutableList.<SkyValueDirtinessChecker>of(), - loadingMock.getProductName()); + loadingMock.getProductName(), + CrossRepositoryLabelViolationStrategy.ERROR); return skyframeExecutor; } 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 ab66841f3b..c137cd3dff 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 @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.util.LoadingMock; import com.google.devtools.build.lib.skyframe.DiffAwareness; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; @@ -482,7 +483,8 @@ public class IncrementalLoadingTest { ImmutableMap.<SkyFunctionName, SkyFunction>of(), ImmutableList.<PrecomputedValue.Injected>of(), ImmutableList.<SkyValueDirtinessChecker>of(), - loadingMock.getProductName()); + loadingMock.getProductName(), + CrossRepositoryLabelViolationStrategy.ERROR); PackageCacheOptions packageCacheOptions = Options.getDefaults(PackageCacheOptions.class); packageCacheOptions.defaultVisibility = ConstantRuleVisibility.PUBLIC; packageCacheOptions.showLoadingProgress = true; diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java index 0688416128..c1279acab7 100644 --- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java +++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java @@ -46,6 +46,7 @@ import com.google.devtools.build.lib.packages.Preprocessor; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.util.MockToolsConfig; import com.google.devtools.build.lib.skyframe.DiffAwareness; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; @@ -611,7 +612,8 @@ public class LoadingPhaseRunnerTest { analysisMock.getSkyFunctions(), ImmutableList.<PrecomputedValue.Injected>of(), ImmutableList.<SkyValueDirtinessChecker>of(), - analysisMock.getProductName()); + analysisMock.getProductName(), + CrossRepositoryLabelViolationStrategy.ERROR); PathPackageLocator pkgLocator = PathPackageLocator.create( null, options.packagePath, storedErrors, workspace, workspace); PackageCacheOptions packageCacheOptions = Options.getDefaults(PackageCacheOptions.class); diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java index a68ad4e388..77e34d95fa 100644 --- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java +++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java @@ -42,6 +42,7 @@ import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.util.MockToolsConfig; import com.google.devtools.build.lib.skyframe.DiffAwareness; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor; import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker; @@ -97,7 +98,8 @@ public class PackageCacheTest extends FoundationTestCase { AnalysisMock.get().getSkyFunctions(), ImmutableList.<PrecomputedValue.Injected>of(), ImmutableList.<SkyValueDirtinessChecker>of(), - analysisMock.getProductName()); + analysisMock.getProductName(), + CrossRepositoryLabelViolationStrategy.ERROR); setUpSkyframe(parsePackageCacheOptions()); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java index 44abe8843f..79e4013a93 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.ActionLookupValue.ActionLookupKey; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.testutil.TestRuleClassProvider; import com.google.devtools.build.lib.testutil.TestUtils; @@ -38,14 +39,12 @@ import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - -import org.junit.Before; - import java.io.IOException; import java.util.HashSet; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; +import org.junit.Before; abstract class ArtifactFunctionTestCase { protected static final SkyKey OWNER_KEY = SkyKey.create(SkyFunctions.ACTION_LOOKUP, "OWNER"); @@ -79,17 +78,19 @@ abstract class ArtifactFunctionTestCase { evaluator = new InMemoryMemoizingEvaluator( ImmutableMap.<SkyFunctionName, SkyFunction>builder() - .put(SkyFunctions.FILE_STATE, + .put( + SkyFunctions.FILE_STATE, new FileStateFunction( new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)) .put(SkyFunctions.FILE, new FileFunction(pkgLocator)) - .put(SkyFunctions.ARTIFACT, - new ArtifactFunction(allowedMissingInputsPredicate)) + .put(SkyFunctions.ARTIFACT, new ArtifactFunction(allowedMissingInputsPredicate)) .put(SkyFunctions.ACTION_EXECUTION, new SimpleActionExecutionFunction()) .put( SkyFunctions.PACKAGE, new PackageFunction(null, null, null, null, null, null, null)) - .put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(null)) + .put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(null, CrossRepositoryLabelViolationStrategy.ERROR)) .put( SkyFunctions.WORKSPACE_AST, new WorkspaceASTFunction(TestRuleClassProvider.getRuleClassProvider())) @@ -98,12 +99,10 @@ abstract class ArtifactFunctionTestCase { new WorkspaceFileFunction( TestRuleClassProvider.getRuleClassProvider(), TestConstants.PACKAGE_FACTORY_FACTORY_FOR_TESTING.create( - TestRuleClassProvider.getRuleClassProvider(), - root.getFileSystem()), + TestRuleClassProvider.getRuleClassProvider(), root.getFileSystem()), directories)) .put(SkyFunctions.EXTERNAL_PACKAGE, new ExternalPackageFunction()) - .put(SkyFunctions.ACTION_TEMPLATE_EXPANSION, - new ActionTemplateExpansionFunction()) + .put(SkyFunctions.ACTION_TEMPLATE_EXPANSION, new ActionTemplateExpansionFunction()) .build(), differencer); driver = new SequentialBuildDriver(evaluator); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java index b2fb2d87f5..6c42579537 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.testutil.FoundationTestCase; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; @@ -35,16 +36,14 @@ import com.google.devtools.build.skyframe.SequentialBuildDriver; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; /** * Tests for {@link ContainingPackageLookupFunction}. @@ -66,7 +65,9 @@ public class ContainingPackageLookupFunctionTest extends FoundationTestCase { TestConstants.PRODUCT_NAME)); Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>(); - skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(deletedPackages)); + skyFunctions.put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(deletedPackages, CrossRepositoryLabelViolationStrategy.ERROR)); skyFunctions.put(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, new ContainingPackageLookupFunction()); skyFunctions.put(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, new BlacklistedPackagePrefixesFunction()); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java index 323fa84ad5..5257324ff4 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java @@ -40,6 +40,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.testutil.ManualClock; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.testutil.TestRuleClassProvider; @@ -142,7 +143,8 @@ public class FileFunctionTest { .put( SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction( - new AtomicReference<>(ImmutableSet.<PackageIdentifier>of()))) + new AtomicReference<>(ImmutableSet.<PackageIdentifier>of()), + CrossRepositoryLabelViolationStrategy.ERROR)) .put( SkyFunctions.WORKSPACE_AST, new WorkspaceASTFunction(TestRuleClassProvider.getRuleClassProvider())) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java index 660773f3ab..e4b5bbeef5 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java @@ -36,6 +36,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.packages.FilesetEntry.SymlinkBehavior; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.testutil.FoundationTestCase; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.util.Fingerprint; @@ -53,12 +54,6 @@ import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -67,8 +62,11 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; - import javax.annotation.Nullable; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; /** Tests for {@link FilesetEntryFunction}. */ @RunWith(JUnit4.class) @@ -99,7 +97,9 @@ public final class FilesetEntryFunctionTest extends FoundationTestCase { new DirectoryListingStateFunction(externalFilesHelper)); skyFunctions.put( SkyFunctions.RECURSIVE_FILESYSTEM_TRAVERSAL, new RecursiveFilesystemTraversalFunction()); - skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(deletedPackages)); + skyFunctions.put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(deletedPackages, CrossRepositoryLabelViolationStrategy.ERROR)); skyFunctions.put(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, new BlacklistedPackagePrefixesFunction()); skyFunctions.put(SkyFunctions.FILESET_ENTRY, new FilesetEntryFunction()); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java index a64ec6d36e..1ec88f5ce1 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java @@ -37,6 +37,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.BasicFilesystemDirtinessChecker; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.testutil.TestRuleClassProvider; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; @@ -113,8 +114,11 @@ public class FilesystemValueCheckerTest { new FileSymlinkInfiniteExpansionUniquenessFunction()); skyFunctions.put(SkyFunctions.PACKAGE, new PackageFunction(null, null, null, null, null, null, null)); - skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, - new PackageLookupFunction(new AtomicReference<>(ImmutableSet.<PackageIdentifier>of()))); + skyFunctions.put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction( + new AtomicReference<>(ImmutableSet.<PackageIdentifier>of()), + CrossRepositoryLabelViolationStrategy.ERROR)); skyFunctions.put(SkyFunctions.WORKSPACE_AST, new WorkspaceASTFunction(TestRuleClassProvider.getRuleClassProvider())); skyFunctions.put(SkyFunctions.WORKSPACE_FILE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java index dbef1f5eaf..a00dd07a16 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.testutil.ManualClock; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; @@ -52,19 +53,16 @@ import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; - import javax.annotation.Nullable; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; /** * Tests for {@link GlobFunction}. @@ -133,7 +131,9 @@ public abstract class GlobFunctionTest { SkyFunctions.DIRECTORY_LISTING_STATE, new DirectoryListingStateFunction(externalFilesHelper)); skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); - skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(deletedPackages)); + skyFunctions.put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(deletedPackages, CrossRepositoryLabelViolationStrategy.ERROR)); skyFunctions.put(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, new BlacklistedPackagePrefixesFunction()); skyFunctions.put( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java index b04b79868c..c200c41347 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.PackageLookupValue.BuildFileName; import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason; import com.google.devtools.build.lib.testutil.FoundationTestCase; @@ -52,16 +53,15 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -/** - * Tests for {@link PackageLookupFunction}. - */ -@RunWith(JUnit4.class) -public class PackageLookupFunctionTest extends FoundationTestCase { +/** Tests for {@link PackageLookupFunction}. */ +public abstract class PackageLookupFunctionTest extends FoundationTestCase { private AtomicReference<ImmutableSet<PackageIdentifier>> deletedPackages; private MemoizingEvaluator evaluator; private SequentialBuildDriver driver; private RecordingDifferencer differencer; + protected abstract CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy(); + @Before public final void setUp() throws Exception { Path emptyPackagePath = rootDirectory.getRelative("somewhere/else"); @@ -78,8 +78,9 @@ public class PackageLookupFunctionTest extends FoundationTestCase { pkgLocator, false, directories); Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>(); - skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, - new PackageLookupFunction(deletedPackages)); + skyFunctions.put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(deletedPackages, crossRepositoryLabelViolationStrategy())); skyFunctions.put( SkyFunctions.PACKAGE, new PackageFunction(null, null, null, null, null, null, null)); @@ -253,4 +254,36 @@ public class PackageLookupFunctionTest extends FoundationTestCase { PackageLookupValue.invalidPackageName("nope2")) .testEquals(); } + + /** + * Runs all tests in the base {@link PackageLookupFunctionTest} class with the + * {@link CrossRepositoryLabelViolationStrategy#IGNORE} enum set, and also additional tests + * specific to that setting. + */ + @RunWith(JUnit4.class) + public static class IgnoreLabelViolationsTest + extends PackageLookupFunctionTest { + @Override + protected CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy() { + return CrossRepositoryLabelViolationStrategy.IGNORE; + } + + // Add any ignore-specific tests here. + } + + /** + * Runs all tests in the base {@link PackageLookupFunctionTest} class with the + * {@link CrossRepositoryLabelViolationStrategy#ERROR} enum set, and also additional tests + * specific to that setting. + */ + @RunWith(JUnit4.class) + public static class ErrorLabelViolationsTest + extends PackageLookupFunctionTest { + @Override + protected CrossRepositoryLabelViolationStrategy crossRepositoryLabelViolationStrategy() { + return CrossRepositoryLabelViolationStrategy.ERROR; + } + + // Add any error-specific tests here. + } } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java index 7841f36184..4bbad979e2 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java @@ -35,6 +35,7 @@ import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.TraversalRequest; import com.google.devtools.build.lib.testutil.FoundationTestCase; @@ -54,12 +55,6 @@ import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.HashMap; @@ -69,6 +64,10 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; /** Tests for {@link RecursiveFilesystemTraversalFunction}. */ @RunWith(JUnit4.class) @@ -103,13 +102,13 @@ public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTe new DirectoryListingStateFunction(externalFilesHelper)); skyFunctions.put( SkyFunctions.RECURSIVE_FILESYSTEM_TRAVERSAL, new RecursiveFilesystemTraversalFunction()); - skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(deletedPackages)); + skyFunctions.put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(deletedPackages, CrossRepositoryLabelViolationStrategy.ERROR)); skyFunctions.put(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, new BlacklistedPackagePrefixesFunction()); skyFunctions.put(SkyFunctions.PACKAGE, new PackageFunction(null, null, null, null, null, null, null)); - skyFunctions.put(SkyFunctions.PACKAGE_LOOKUP, - new PackageLookupFunction(deletedPackages)); skyFunctions.put(SkyFunctions.WORKSPACE_AST, new WorkspaceASTFunction(ruleClassProvider)); skyFunctions.put( SkyFunctions.WORKSPACE_FILE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java index a8ffdfea20..943e5ae0ec 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java @@ -48,6 +48,7 @@ import com.google.devtools.build.lib.buildtool.SkyframeBuilder; import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; +import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.testutil.FoundationTestCase; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.testutil.TestRuleClassProvider; @@ -175,7 +176,9 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase { .put( SkyFunctions.PACKAGE, new PackageFunction(null, null, null, null, null, null, null)) - .put(SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction(null)) + .put( + SkyFunctions.PACKAGE_LOOKUP, + new PackageLookupFunction(null, CrossRepositoryLabelViolationStrategy.ERROR)) .put( SkyFunctions.WORKSPACE_AST, new WorkspaceASTFunction(TestRuleClassProvider.getRuleClassProvider())) @@ -184,12 +187,12 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase { new WorkspaceFileFunction( TestRuleClassProvider.getRuleClassProvider(), TestConstants.PACKAGE_FACTORY_FACTORY_FOR_TESTING.create( - TestRuleClassProvider.getRuleClassProvider(), - scratch.getFileSystem()), + TestRuleClassProvider.getRuleClassProvider(), scratch.getFileSystem()), directories)) .put(SkyFunctions.EXTERNAL_PACKAGE, new ExternalPackageFunction()) - .put(SkyFunctions.ACTION_TEMPLATE_EXPANSION, - new DelegatingActionTemplateExpansionFunction()) + .put( + SkyFunctions.ACTION_TEMPLATE_EXPANSION, + new DelegatingActionTemplateExpansionFunction()) .build(), differencer, evaluationProgressReceiver); @@ -440,6 +443,6 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase { @Override public String extractTag(SkyKey skyKey) { return actionTemplateExpansionFunction.extractTag(skyKey); - } + } } } |