diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
6 files changed, 34 insertions, 44 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java index 71c5f0ac2c..3f18f8502b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java @@ -53,12 +53,6 @@ public class BuildConfigurationFunction implements SkyFunction { @Override public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException, BuildConfigurationFunctionException { - WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env - .getValue(WorkspaceNameValue.key()); - if (workspaceNameValue == null) { - return null; - } - BuildConfigurationValue.Key key = (BuildConfigurationValue.Key) skyKey.argument(); Set<Fragment> fragments; try { @@ -76,7 +70,7 @@ public class BuildConfigurationFunction implements SkyFunction { } BuildConfiguration config = new BuildConfiguration(directories, fragmentsMap, - key.getBuildOptions(), !key.actionsEnabled(), workspaceNameValue.getName()); + key.getBuildOptions(), !key.actionsEnabled()); // Unlike static configurations, dynamic configurations don't need to embed transition logic // within the configuration itself. However we still use this interface to provide a mapping // between Transition types (e.g. HOST) and the dynamic transitions that apply those diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java index 79011a82a9..4e91031903 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java @@ -64,7 +64,7 @@ public class BuildInfoCollectionFunction implements SkyFunction { return null; } RepositoryName repositoryName = RepositoryName.createFromValidStrippedName( - nameValue.getName()); + nameValue.maybeGetName()); final ArtifactFactory factory = artifactFactory.get(); BuildInfoContext context = new BuildInfoContext() { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java index 3c252f8886..7326fb1855 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionFunction.java @@ -55,17 +55,11 @@ public class ConfigurationCollectionFunction implements SkyFunction { @Override public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException, ConfigurationCollectionFunctionException { - WorkspaceNameValue workspaceNameValue = (WorkspaceNameValue) env - .getValue(WorkspaceNameValue.key()); - if (workspaceNameValue == null) { - return null; - } ConfigurationCollectionKey collectionKey = (ConfigurationCollectionKey) skyKey.argument(); try { BuildConfigurationCollection result = getConfigurations(env, new SkyframePackageLoaderWithValueEnvironment(env, ruleClassProvider), - collectionKey.getBuildOptions(), collectionKey.getMultiCpu(), - workspaceNameValue.getName()); + collectionKey.getBuildOptions(), collectionKey.getMultiCpu()); // BuildConfigurationCollection can be created, but dependencies to some files might be // missing. In that case we need to build configurationCollection again. @@ -84,8 +78,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { Environment env, PackageProviderForConfigurations loadedPackageProvider, BuildOptions buildOptions, - ImmutableSet<String> multiCpu, - String repositoryName) + ImmutableSet<String> multiCpu) throws InvalidConfigurationException, InterruptedException { // We cache all the related configurations for this target configuration in a cache that is // dropped at the end of this method call. We instead rely on the cache for entire collections @@ -98,7 +91,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { if (!multiCpu.isEmpty()) { for (String cpu : multiCpu) { BuildConfiguration targetConfiguration = createConfiguration( - cache, env.getListener(), loadedPackageProvider, buildOptions, cpu, repositoryName); + cache, env.getListener(), loadedPackageProvider, buildOptions, cpu); if (targetConfiguration == null || targetConfigurations.contains(targetConfiguration)) { continue; } @@ -109,7 +102,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { } } else { BuildConfiguration targetConfiguration = createConfiguration( - cache, env.getListener(), loadedPackageProvider, buildOptions, null, repositoryName); + cache, env.getListener(), loadedPackageProvider, buildOptions, null); if (targetConfiguration == null) { return null; } @@ -165,8 +158,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { ExtendedEventHandler originalEventListener, PackageProviderForConfigurations loadedPackageProvider, BuildOptions buildOptions, - String cpuOverride, - String repositoryName) + String cpuOverride) throws InvalidConfigurationException, InterruptedException { ErrorSensingEventHandler eventHandler = new ErrorSensingEventHandler(originalEventListener); if (cpuOverride != null) { @@ -178,7 +170,7 @@ public class ConfigurationCollectionFunction implements SkyFunction { } BuildConfiguration targetConfig = configurationFactory.get().createConfigurations( - cache, loadedPackageProvider, buildOptions, eventHandler, repositoryName); + cache, loadedPackageProvider, buildOptions, eventHandler); if (targetConfig == null) { return null; } 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 370c69f595..1941489a77 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 @@ -453,7 +453,13 @@ public class PackageFunction implements SkyFunction { if (workspaceNameValue == null) { return null; } - String workspaceName = workspaceNameValue.getName(); + String workspaceName = workspaceNameValue.maybeGetName(); + if (workspaceName == null) { + throw new PackageFunctionException( + new BuildFileContainsErrorsException(Label.EXTERNAL_PACKAGE_IDENTIFIER), + Transience.PERSISTENT); + } + RootedPath buildFileRootedPath = packageLookupValue.getRootedPath(packageId); FileValue buildFileValue = null; Path buildFilePath = buildFileRootedPath.asPath(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java index 9284f5c2e9..f6dc151dfe 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java @@ -14,11 +14,9 @@ package com.google.devtools.build.lib.skyframe; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.skyframe.SkyFunction; -import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import javax.annotation.Nullable; @@ -26,24 +24,22 @@ import javax.annotation.Nullable; /** * {@link SkyFunction} for {@link WorkspaceNameValue}s. * - * <p>All errors (e.g. parsing errors or a symlink cycle encountered when consuming the WORKSPACE - * file) result in a {@link NoSuchPackageException}. + * <p>All transitive errors (e.g. a symlink cycle encountered when consuming the WORKSPACE file) + * result in a {@link NoSuchPackageException}. */ public class WorkspaceNameFunction implements SkyFunction { @Override @Nullable - public SkyValue compute(SkyKey skyKey, Environment env) - throws InterruptedException, WorkspaceNameFunctionException { + public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException { SkyKey externalPackageKey = PackageValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER); PackageValue externalPackageValue = (PackageValue) env.getValue(externalPackageKey); if (externalPackageValue == null) { return null; } Package externalPackage = externalPackageValue.getPackage(); - if (externalPackage.containsErrors()) { - throw new WorkspaceNameFunctionException(); - } - return WorkspaceNameValue.withName(externalPackage.getWorkspaceName()); + return externalPackage.containsErrors() + ? WorkspaceNameValue.withError() + : WorkspaceNameValue.withName(externalPackage.getWorkspaceName()); } @Override @@ -51,11 +47,4 @@ public class WorkspaceNameFunction implements SkyFunction { public String extractTag(SkyKey skyKey) { return null; } - - private class WorkspaceNameFunctionException extends SkyFunctionException { - WorkspaceNameFunctionException() { - super(new BuildFileContainsErrorsException(Label.EXTERNAL_PACKAGE_IDENTIFIER), - Transience.PERSISTENT); - } - } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java index bbcebba5f4..1fccf6d4da 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java @@ -17,6 +17,7 @@ import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Objects; +import javax.annotation.Nullable; /** * A value that solely represents the 'name' of a Bazel workspace, as defined in the WORKSPACE file. @@ -29,17 +30,20 @@ import java.util.Objects; public class WorkspaceNameValue implements SkyValue { private static final SkyKey KEY = SkyKey.create(SkyFunctions.WORKSPACE_NAME, DummyArgument.INSTANCE); + private static final WorkspaceNameValue ERROR = new WorkspaceNameValue(null); + @Nullable private final String workspaceName; - private WorkspaceNameValue(String workspaceName) { + private WorkspaceNameValue(@Nullable String workspaceName) { this.workspaceName = workspaceName; } /** - * Returns the name of the workspace. + * Returns the name of the workspace, or {@code null} if there was an error in the WORKSPACE file. */ - public String getName() { + @Nullable + public String maybeGetName() { return workspaceName; } @@ -48,6 +52,11 @@ public class WorkspaceNameValue implements SkyValue { return KEY; } + /** Returns a {@link WorkspaceNameValue} for a workspace whose WORKSPACE file is in error. */ + public static WorkspaceNameValue withError() { + return WorkspaceNameValue.ERROR; + } + /** Returns a {@link WorkspaceNameValue} for a workspace with the given name. */ public static WorkspaceNameValue withName(String workspaceName) { return new WorkspaceNameValue(Preconditions.checkNotNull(workspaceName)); @@ -74,7 +83,7 @@ public class WorkspaceNameValue implements SkyValue { /** Singleton class used as the {@link SkyKey#argument} for {@link WorkspaceNameValue#key}. */ public static final class DummyArgument { - static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode(); + public static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode(); public static final DummyArgument INSTANCE = new DummyArgument(); private DummyArgument() { |