Parse built-in WORKSPACE files

This doesn't actually add any default workspace files, yet, but adds machinery
for them.  Also did some cleanup/renaming.

--
MOS_MIGRATED_REVID=86085127
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 9c92b33..ac4920c 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
@@ -34,6 +34,7 @@
  */
 public class ExternalPackage extends Package {
 
+  private String workspaceName;
   private Map<RepositoryName, Rule> repositoryMap;
 
   ExternalPackage() {
@@ -41,6 +42,13 @@
   }
 
   /**
+   * Returns the name for this repository.
+   */
+  public String getWorkspaceName() {
+    return workspaceName;
+  }
+
+  /**
    * Returns a description of the repository with the given name, or null if there's no such
    * repository.
    */
@@ -79,28 +87,37 @@
   /**
    * Given a workspace file path, creates an ExternalPackage.
    */
-  public static class ExternalPackageBuilder
-      extends AbstractBuilder<ExternalPackage, ExternalPackageBuilder> {
+  public static class Builder
+      extends AbstractBuilder<ExternalPackage, Builder> {
+    private String workspaceName;
     private Map<Label, Binding> bindMap = Maps.newHashMap();
     private Map<RepositoryName, Rule> repositoryMap = Maps.newHashMap();
 
-    public ExternalPackageBuilder(Path workspacePath) {
+    public Builder(Path workspacePath) {
       super(new ExternalPackage());
       setFilename(workspacePath);
       setMakeEnv(new MakeEnvironment.Builder());
     }
 
     @Override
-    protected ExternalPackageBuilder self() {
+    protected Builder self() {
       return this;
     }
 
     @Override
     public ExternalPackage build() {
+      pkg.workspaceName = workspaceName;
       pkg.repositoryMap = ImmutableMap.copyOf(repositoryMap);
       return super.build();
     }
 
+    /**
+     * Sets the name for this repository.
+     */
+    public void setWorkspaceName(String name) {
+      workspaceName = name;
+    }
+
     public void addBinding(Label label, Binding binding) {
       bindMap.put(label, binding);
     }
@@ -178,7 +195,7 @@
      * Creates an external repository rule.
      * @throws SyntaxException if the repository name is invalid.
      */
-    public ExternalPackageBuilder createAndAddRepositoryRule(RuleClass ruleClass,
+    public Builder createAndAddRepositoryRule(RuleClass ruleClass,
         Map<String, Object> kwargs, FuncallExpression ast)
             throws InvalidRuleException, NameConflictException, SyntaxException {
       StoredEventHandler eventHandler = new StoredEventHandler();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index 90fdfca..07b1b18 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -17,7 +17,9 @@
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
 import com.google.devtools.build.lib.syntax.ValidationEnvironment;
+import com.google.devtools.build.lib.vfs.PathFragment;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -46,4 +48,11 @@
    * Returns the Skylark module to register the native rules with.
    */
   Object getNativeModule();
+
+  /**
+   * Returns paths to the WORKSPACE files needed to provide external dependencies for built-in
+   * rules.  The PathFragments are relative to Bazel's install directory. Returns an empty list if
+   * there are none defined.
+   */
+  List<PathFragment> getWorkspaceFiles();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
index c79bbaa..cffef50 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.Label;
 import com.google.devtools.build.lib.syntax.Label.SyntaxException;
-import com.google.devtools.build.lib.vfs.PathFragment;
 
 import java.util.Map;
 import java.util.Set;
@@ -106,7 +105,7 @@
       throw new InvalidRuleException("illegal rule name: " + name + ": " + e.getMessage());
     }
     boolean inWorkspaceFile = location.getPath() != null
-        && location.getPath().endsWith(new PathFragment("WORKSPACE"));
+        && location.getPath().getBaseName().contains("WORKSPACE");
     if (ruleClass.getWorkspaceOnly() && !inWorkspaceFile) {
       throw new RuleFactory.InvalidRuleException(ruleClass + " must be in the WORKSPACE file "
           + "(used by " + label + ")");