diff options
author | Kristina Chodorow <kchodorow@google.com> | 2016-10-06 18:28:22 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-10-07 08:07:47 +0000 |
commit | 5c071429e83b5c6d872c755d3da21ad934638111 (patch) | |
tree | 742d97805a888bf68c24d98fbc8f2ace592cac65 /src/main/java/com/google/devtools/build | |
parent | 0bd3739ec3b301d3a075280f21cd8dd2c1782546 (diff) |
Allow repositories to refer to the local repository by repo name
For example, if the main repository is named @foo, other repositories can refer
to targets in it as @foo//path/to:target (instead of @//path/to:target).
Fixes #1248.
--
MOS_MIGRATED_REVID=135382972
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java index 12c5caa66b..92f8c96072 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java +++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java @@ -26,9 +26,9 @@ import com.google.devtools.build.lib.cmdline.LabelValidator; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.events.StoredEventHandler; -import com.google.devtools.build.lib.packages.Package.Builder; import com.google.devtools.build.lib.packages.Package.NameConflictException; import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension; +import com.google.devtools.build.lib.packages.RuleFactory.InvalidRuleException; import com.google.devtools.build.lib.skylarkinterface.Param; import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature; import com.google.devtools.build.lib.syntax.BaseFunction; @@ -71,13 +71,14 @@ public class WorkspaceFactory { "DEFAULT_SERVER_JAVABASE", // serializable so optional PackageFactory.PKG_CONTEXT); - private final Builder builder; + private final Package.Builder builder; private final Path installDir; private final Path workspaceDir; private final Mutability mutability; private final boolean allowOverride; + private final RuleFactory ruleFactory; private final ImmutableMap<String, BaseFunction> workspaceFunctions; private final ImmutableList<EnvironmentExtension> environmentExtensions; @@ -100,7 +101,7 @@ public class WorkspaceFactory { * @param mutability the Mutability for the current evaluation context */ public WorkspaceFactory( - Builder builder, + Package.Builder builder, RuleClassProvider ruleClassProvider, ImmutableList<EnvironmentExtension> environmentExtensions, Mutability mutability) { @@ -117,7 +118,7 @@ public class WorkspaceFactory { * @param workspaceDir the workspace directory */ public WorkspaceFactory( - Builder builder, + Package.Builder builder, RuleClassProvider ruleClassProvider, ImmutableList<EnvironmentExtension> environmentExtensions, Mutability mutability, @@ -130,7 +131,10 @@ public class WorkspaceFactory { this.workspaceDir = workspaceDir; this.allowOverride = allowOverride; this.environmentExtensions = environmentExtensions; - this.workspaceFunctions = createWorkspaceFunctions(ruleClassProvider, allowOverride); + this.ruleFactory = new RuleFactory( + ruleClassProvider, AttributeContainer.ATTRIBUTE_CONTAINER_FACTORY); + this.workspaceFunctions = WorkspaceFactory.createWorkspaceFunctions( + allowOverride, ruleFactory); } /** @@ -288,18 +292,17 @@ public class WorkspaceFactory { parameters = { @Param(name = "name", type = String.class, doc = "the name of the workspace.") }, - documented = true, useAst = true, useEnvironment = true ) private static final BuiltinFunction.Factory newWorkspaceFunction = new BuiltinFunction.Factory("workspace") { - public BuiltinFunction create(boolean allowOverride) { + public BuiltinFunction create(boolean allowOverride, final RuleFactory ruleFactory) { if (allowOverride) { return new BuiltinFunction( "workspace", FunctionSignature.namedOnly("name"), BuiltinFunction.USE_AST_ENV) { public Object invoke(String name, FuncallExpression ast, Environment env) - throws EvalException { + throws EvalException, InterruptedException { if (!isLegalWorkspaceName(name)) { throw new EvalException( ast.getLocation(), name + " is not a legal workspace name"); @@ -309,6 +312,25 @@ public class WorkspaceFactory { throw new EvalException(ast.getLocation(), errorMessage); } PackageFactory.getContext(env, ast).pkgBuilder.setWorkspaceName(name); + Package.Builder builder = PackageFactory.getContext(env, ast).pkgBuilder; + RuleClass localRepositoryRuleClass = ruleFactory.getRuleClass("local_repository"); + RuleClass bindRuleClass = ruleFactory.getRuleClass("bind"); + Map<String, Object> kwargs = ImmutableMap.<String, Object>of( + "name", name, "path", "."); + try { + // This effectively adds a "local_repository(name = "<ws>", path = ".")" + // definition to the WORKSPACE file. + builder + .externalPackageData() + .createAndAddRepositoryRule( + builder, + localRepositoryRuleClass, + bindRuleClass, + kwargs, + ast); + } catch (InvalidRuleException | NameConflictException | LabelSyntaxException e) { + throw new EvalException(ast.getLocation(), e.getMessage()); + } return NONE; } }; @@ -330,11 +352,11 @@ public class WorkspaceFactory { "bind", FunctionSignature.namedOnly(1, "name", "actual"), BuiltinFunction.USE_AST_ENV) { public Object invoke(String name, String actual, FuncallExpression ast, Environment env) throws EvalException, InterruptedException { - Label nameLabel = null; + Label nameLabel; try { nameLabel = Label.parseAbsolute("//external:" + name); try { - Builder builder = PackageFactory.getContext(env, ast).pkgBuilder; + Package.Builder builder = PackageFactory.getContext(env, ast).pkgBuilder; RuleClass ruleClass = ruleFactory.getRuleClass("bind"); builder .externalPackageData() @@ -370,7 +392,7 @@ public class WorkspaceFactory { public Object invoke(Map<String, Object> kwargs, FuncallExpression ast, Environment env) throws EvalException, InterruptedException { try { - Builder builder = PackageFactory.getContext(env, ast).pkgBuilder; + Package.Builder builder = PackageFactory.getContext(env, ast).pkgBuilder; if (!allowOverride && kwargs.containsKey("name") && builder.targets.containsKey(kwargs.get("name"))) { @@ -402,10 +424,8 @@ public class WorkspaceFactory { } private static ImmutableMap<String, BaseFunction> createWorkspaceFunctions( - RuleClassProvider ruleClassProvider, boolean allowOverride) { + boolean allowOverride, RuleFactory ruleFactory) { ImmutableMap.Builder<String, BaseFunction> mapBuilder = ImmutableMap.builder(); - RuleFactory ruleFactory = - new RuleFactory(ruleClassProvider, AttributeContainer.ATTRIBUTE_CONTAINER_FACTORY); mapBuilder.put(BIND, newBindFunction(ruleFactory)); for (String ruleClass : ruleFactory.getRuleClassNames()) { if (!ruleClass.equals(BIND)) { @@ -418,7 +438,7 @@ public class WorkspaceFactory { private void addWorkspaceFunctions(Environment workspaceEnv, StoredEventHandler localReporter) { try { - workspaceEnv.setup("workspace", newWorkspaceFunction.apply(allowOverride)); + workspaceEnv.setup("workspace", newWorkspaceFunction.apply(allowOverride, ruleFactory)); for (Map.Entry<String, BaseFunction> function : workspaceFunctions.entrySet()) { workspaceEnv.update(function.getKey(), function.getValue()); } @@ -458,8 +478,11 @@ public class WorkspaceFactory { builder.build(), "no native function or rule '%s'"); } - public static ClassObject newNativeModule(RuleClassProvider ruleClassProvider, String version) { - return newNativeModule(createWorkspaceFunctions(ruleClassProvider, false), version); + static ClassObject newNativeModule(RuleClassProvider ruleClassProvider, String version) { + RuleFactory ruleFactory = new RuleFactory( + ruleClassProvider, AttributeContainer.ATTRIBUTE_CONTAINER_FACTORY); + return WorkspaceFactory.newNativeModule( + WorkspaceFactory.createWorkspaceFunctions(false, ruleFactory), version); } static { |