aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
diff options
context:
space:
mode:
authorGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-09 18:58:18 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-02-10 10:23:44 +0000
commite891646a17ba8a86b13b163a386f711b5a83547b (patch)
treeb6f057d1bf03d15cb94254c6b1223b00f5761af7 /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
parentea172999bd6f0b6f5b05613040f730a03ea40a1d (diff)
Split the execution of the WORKSPACE file after each load statement
This is the main step toward supporting load statement of remote repository in the WORKSPACE file (bug #824). Load statement that refers to a remote repository will depend on the previous fragment of the workspace file. Issue #824 Step 3. -- MOS_MIGRATED_REVID=114237027
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java62
1 files changed, 46 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 305d2e89fc..2ab3267d87 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -14,15 +14,19 @@
package com.google.devtools.build.lib.skyframe;
+import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Package.LegacyBuilder;
+import com.google.devtools.build.lib.packages.Package.NameConflictException;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.RuleClassProvider;
import com.google.devtools.build.lib.packages.WorkspaceFactory;
import com.google.devtools.build.lib.skyframe.PackageFunction.PackageFunctionException;
import com.google.devtools.build.lib.skyframe.WorkspaceFileValue.WorkspaceFileKey;
import com.google.devtools.build.lib.syntax.BuildFileAST;
+import com.google.devtools.build.lib.syntax.Environment.Extension;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.RootedPath;
@@ -64,10 +68,20 @@ public class WorkspaceFileFunction implements SkyFunction {
Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath());
LegacyBuilder builder =
- com.google.devtools.build.lib.packages.Package.newExternalPackageBuilder(
- repoWorkspace, ruleClassProvider.getRunfilesPrefix());
+ Package.newExternalPackageBuilder(repoWorkspace, ruleClassProvider.getRunfilesPrefix());
+
+ if (workspaceASTValue.getASTs().isEmpty()) {
+ return new WorkspaceFileValue(
+ builder.build(), // resulting package
+ ImmutableMap.<String, Extension>of(), // list of imports
+ ImmutableMap.<String, Object>of(), // list of symbol bindings
+ workspaceRoot, // Workspace root
+ 0, // first fragment, idx = 0
+ false); // last fragment
+ }
+ WorkspaceFactory parser;
try (Mutability mutability = Mutability.create("workspace %s", repoWorkspace)) {
- WorkspaceFactory parser =
+ parser =
new WorkspaceFactory(
builder,
ruleClassProvider,
@@ -75,23 +89,39 @@ public class WorkspaceFileFunction implements SkyFunction {
mutability,
directories.getEmbeddedBinariesRoot(),
directories.getWorkspace());
- try {
- for (BuildFileAST ast : workspaceASTValue.getASTs()) {
- PackageFunction.SkylarkImportResult importResult =
- PackageFunction.fetchImportsFromBuildFile(
- repoWorkspace, Label.EXTERNAL_PACKAGE_IDENTIFIER, ast, env, null);
- if (importResult != null) {
- parser.execute(ast, importResult.importMap);
- } else {
- return null;
- }
+ if (key.getIndex() > 0) {
+ WorkspaceFileValue prevValue =
+ (WorkspaceFileValue)
+ env.getValue(WorkspaceFileValue.key(key.getPath(), key.getIndex() - 1));
+ if (prevValue == null) {
+ return null;
}
- } catch (PackageFunctionException e) {
- throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
+ if (prevValue.next() == null) {
+ return prevValue;
+ }
+ parser.setParent(prevValue.getPackage(), prevValue.getImportMap(), prevValue.getBindings());
+ }
+ BuildFileAST ast = workspaceASTValue.getASTs().get(key.getIndex());
+ PackageFunction.SkylarkImportResult importResult =
+ PackageFunction.fetchImportsFromBuildFile(
+ repoWorkspace, Label.EXTERNAL_PACKAGE_IDENTIFIER, ast, env, null);
+ if (importResult == null) {
+ return null;
}
+ // TODO(dmarting): give a nice error message when redefining a repository name and
+ // getIndex() > 0.
+ parser.execute(ast, importResult.importMap);
+ } catch (PackageFunctionException | NameConflictException e) {
+ throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
}
- return new WorkspaceFileValue(builder.build(), workspaceRoot, 0, false);
+ return new WorkspaceFileValue(
+ builder.build(),
+ parser.getImportMap(),
+ parser.getVariableBindings(),
+ workspaceRoot,
+ key.getIndex(),
+ key.getIndex() < workspaceASTValue.getASTs().size() - 1);
}
@Override