aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
diff options
context:
space:
mode:
authorGravatar Kristina Chodorow <kchodorow@google.com>2015-03-19 14:53:36 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-03-20 14:34:36 +0000
commit745765d86d0418e3fdaee310400de2abf1de0b06 (patch)
tree320dd67f689ba23880df4733ceb80d13d5337c5b /src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
parent3e6bd721e687e51e0fe4068939d6dc34117efce3 (diff)
Allow built-in WORKSPACE rules to be overridden by the user
This will allow thing in, say, jdk.WORKSPACE to be overridden in the main WORKSPACE file. -- MOS_MIGRATED_REVID=89030234
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
index 913959e602..0ca70c0cb9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
@@ -102,8 +102,8 @@ public class ExternalPackage extends Package {
*/
public static class Builder
extends AbstractBuilder<ExternalPackage, Builder> {
- private Map<Label, Binding> bindMap = Maps.newHashMap();
- private Map<RepositoryName, Rule> repositoryMap = Maps.newHashMap();
+ private Map<Label, Binding> bindMap = Maps.newLinkedHashMap();
+ private Map<RepositoryName, Rule> repositoryMap = Maps.newLinkedHashMap();
public Builder(Path workspacePath) {
super(new ExternalPackage());
@@ -118,6 +118,14 @@ public class ExternalPackage extends Package {
@Override
public ExternalPackage build() {
+ for (Rule rule : repositoryMap.values()) {
+ try {
+ addRule(rule);
+ } catch (NameConflictException e) {
+ throw new IllegalStateException("Got a name conflict for " + rule
+ + ", which can't happen: " + e.getMessage());
+ }
+ }
pkg.bindMap = ImmutableMap.copyOf(bindMap);
pkg.repositoryMap = ImmutableMap.copyOf(repositoryMap);
return super.build();
@@ -198,18 +206,17 @@ public class ExternalPackage extends Package {
}
/**
- * Creates an external repository rule.
- * @throws SyntaxException if the repository name is invalid.
+ * Adds the rule to the map of rules. Overwrites rules that are already there, to allow "later"
+ * WORKSPACE files to overwrite "earlier" ones.
*/
- public Builder createAndAddRepositoryRule(RuleClass ruleClass,
- Map<String, Object> kwargs, FuncallExpression ast)
- throws InvalidRuleException, NameConflictException, SyntaxException {
+ public Builder createAndAddRepositoryRule(RuleClass ruleClass, Map<String, Object> kwargs,
+ FuncallExpression ast)
+ throws InvalidRuleException, NameConflictException, SyntaxException {
StoredEventHandler eventHandler = new StoredEventHandler();
- Rule rule = RuleFactory.createAndAddRule(this, ruleClass, kwargs, eventHandler, ast,
+ Rule tempRule = RuleFactory.createRule(this, ruleClass, kwargs, eventHandler, ast,
ast.getLocation());
- // Propagate Rule errors to the builder.
addEvents(eventHandler.getEvents());
- repositoryMap.put(RepositoryName.create("@" + rule.getName()), rule);
+ repositoryMap.put(RepositoryName.create("@" + tempRule.getName()), tempRule);
return this;
}