diff options
author | Damien Martin-Guillerez <dmarting@google.com> | 2016-02-09 18:58:18 +0000 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2016-02-10 10:23:44 +0000 |
commit | e891646a17ba8a86b13b163a386f711b5a83547b (patch) | |
tree | b6f057d1bf03d15cb94254c6b1223b00f5761af7 /src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java | |
parent | ea172999bd6f0b6f5b05613040f730a03ea40a1d (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.java | 62 |
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 |