diff options
author | 2017-07-11 18:12:55 +0200 | |
---|---|---|
committer | 2017-07-11 18:26:24 +0200 | |
commit | 937350211dcd55a4714ec32ebbf33fffcc42cdf2 (patch) | |
tree | 77f2cb3d5b6c4fe1e66691a3f0bc4041593168c4 /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java | |
parent | a334363a500fb9df953fe2c70184ee013ff77ccb (diff) |
Resolve references to @main-repo//foo to //foo
Bazel was creating an dummy external repository for @main-repo, which
doesn't work with package paths and will cause conflicts once
@main-repo//foo and //foo refer to the same path.
This adds a "soft pull" option to WorkspaceNameFunction: it can either
parse the entire WORKSPACE file to find the name or just the first section.
That way PackageLookupFunction can find the repository name without causing
a circular dependency.
This should have no change of behavior and is already tested in
https://github.com/bazelbuild/bazel/blob/master/src/test/shell/bazel/workspace_test.sh#L176.
PiperOrigin-RevId: 161536466
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameFunction.java | 39 |
1 files changed, 35 insertions, 4 deletions
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..4582572c4a 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,9 +14,11 @@ package com.google.devtools.build.lib.skyframe; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.events.Event; 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.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyKey; @@ -34,18 +36,47 @@ public class WorkspaceNameFunction implements SkyFunction { @Nullable public SkyValue compute(SkyKey skyKey, Environment env) throws InterruptedException, WorkspaceNameFunctionException { - SkyKey externalPackageKey = PackageValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER); - PackageValue externalPackageValue = (PackageValue) env.getValue(externalPackageKey); - if (externalPackageValue == null) { + boolean firstChunk = (boolean) skyKey.argument(); + Package externalPackage = firstChunk ? firstChunk(env) : parseFullPackage(env); + if (externalPackage == null) { return null; } - Package externalPackage = externalPackageValue.getPackage(); if (externalPackage.containsErrors()) { + Event.replayEventsOn(env.getListener(), externalPackage.getEvents()); throw new WorkspaceNameFunctionException(); } return WorkspaceNameValue.withName(externalPackage.getWorkspaceName()); } + /** + * This just examines the first chunk of the WORKSPACE file to avoid circular dependencies and + * overeager invalidation during package loading. + */ + private Package firstChunk(Environment env) throws InterruptedException { + SkyKey packageLookupKey = PackageLookupValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER); + PackageLookupValue packageLookupValue = (PackageLookupValue) env.getValue(packageLookupKey); + if (packageLookupValue == null) { + return null; + } + RootedPath workspacePath = packageLookupValue.getRootedPath(Label.EXTERNAL_PACKAGE_IDENTIFIER); + + SkyKey workspaceKey = WorkspaceFileValue.key(workspacePath); + WorkspaceFileValue value = (WorkspaceFileValue) env.getValue(workspaceKey); + if (value == null) { + return null; + } + return value.getPackage(); + } + + private Package parseFullPackage(Environment env) throws InterruptedException { + SkyKey externalPackageKey = PackageValue.key(Label.EXTERNAL_PACKAGE_IDENTIFIER); + PackageValue externalPackageValue = (PackageValue) env.getValue(externalPackageKey); + if (externalPackageValue == null) { + return null; + } + return externalPackageValue.getPackage(); + } + @Override @Nullable public String extractTag(SkyKey skyKey) { |