Pass the repository name through to build info factories

I was fixing the Android tests and I noticed that the bazel_workspace_status_test was failing. It was like when you have a thread coming out of a sweater and you start pulling and pretty soon you have no sweater.  Long story short, my "Android tests fix" cl ended up needing ~1k more lines changed (on top of the existing enormous CL).

So, I'm creating some smaller CLs with the changes that I can extract from the mega CL.  Again.

Prep for #1681.

--
PiperOrigin-RevId: 149106039
MOS_MIGRATED_REVID=149106039
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java
index 2a4b4ca..07e9918 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoFactory.java
@@ -16,6 +16,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
 import java.io.Serializable;
@@ -29,7 +30,7 @@
   /**
    * Type of the build-data artifact.
    */
-  public enum BuildInfoType {
+  enum BuildInfoType {
     /**
      * Ignore changes to this file for the purposes of determining whether an action needs to be
      * re-executed. I.e., the action is only re-executed if at least one other input has changed.
@@ -45,7 +46,7 @@
   /**
    * Context for the creation of build-info artifacts.
    */
-  public interface BuildInfoContext {
+  interface BuildInfoContext {
     Artifact getBuildInfoArtifact(PathFragment rootRelativePath, Root root, BuildInfoType type);
   }
 
@@ -53,7 +54,7 @@
    * Build-info key for lookup from the {@link
    * com.google.devtools.build.lib.analysis.AnalysisEnvironment}.
    */
-  public static final class BuildInfoKey implements Serializable {
+  final class BuildInfoKey implements Serializable {
     private final String name;
 
     public BuildInfoKey(String name) {
@@ -83,7 +84,7 @@
    * Create actions and artifacts for language-specific build-info files.
    */
   BuildInfoCollection create(BuildInfoContext context, BuildConfiguration config,
-      Artifact buildInfo, Artifact buildChangelist);
+      Artifact buildInfo, Artifact buildChangelist, RepositoryName repositoryName);
 
   /**
    * Returns the key for the information created by this factory.
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
index ba0f6b4..ae1fe70 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryName.java
@@ -119,6 +119,18 @@
   }
 
   /**
+   * Creates a RepositoryName from a known-valid string (not @-prefixed). Generally this is a
+   * directory that has been created via getSourceRoot() or getPathUnderExecRoot().
+   */
+  public static RepositoryName createFromValidStrippedName(String name) {
+    try {
+      return repositoryNameCache.get("@" + name);
+    } catch (ExecutionException e) {
+      throw new IllegalArgumentException(e.getMessage());
+    }
+  }
+
+  /**
    * Extracts the repository name from a PathFragment that was created with
    * {@code PackageIdentifier.getSourceRoot}.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
index 71be346..30a5515 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppBuildInfo.java
@@ -44,19 +44,19 @@
 
   @Override
   public BuildInfoCollection create(BuildInfoContext buildInfoContext, BuildConfiguration config,
-      Artifact buildInfo, Artifact buildChangelist) {
+      Artifact buildInfo, Artifact buildChangelist, RepositoryName repositoryName) {
     List<Action> actions = new ArrayList<>();
     WriteBuildInfoHeaderAction redactedInfo = getHeader(buildInfoContext, config,
         BUILD_INFO_REDACTED_HEADER_NAME,
-        Artifact.NO_ARTIFACTS, true, true);
+        Artifact.NO_ARTIFACTS, true, true, repositoryName);
     WriteBuildInfoHeaderAction nonvolatileInfo = getHeader(buildInfoContext, config,
         BUILD_INFO_NONVOLATILE_HEADER_NAME,
         ImmutableList.of(buildInfo),
-        false, true);
+        false, true, repositoryName);
     WriteBuildInfoHeaderAction volatileInfo = getHeader(buildInfoContext, config,
         BUILD_INFO_VOLATILE_HEADER_NAME,
         ImmutableList.of(buildChangelist),
-        true, false);
+        true, false, repositoryName);
     actions.add(redactedInfo);
     actions.add(nonvolatileInfo);
     actions.add(volatileInfo);
@@ -68,8 +68,8 @@
   private WriteBuildInfoHeaderAction getHeader(BuildInfoContext buildInfoContext,
       BuildConfiguration config, PathFragment headerName,
       Collection<Artifact> inputs,
-      boolean writeVolatileInfo, boolean writeNonVolatileInfo) {
-    Root outputPath = config.getIncludeDirectory(RepositoryName.MAIN);
+      boolean writeVolatileInfo, boolean writeNonVolatileInfo, RepositoryName repositoryName) {
+    Root outputPath = config.getIncludeDirectory(repositoryName);
     final Artifact header =
         buildInfoContext.getBuildInfoArtifact(headerName, outputPath,
             writeVolatileInfo && !inputs.isEmpty()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
index 3ab7bde..95e1cc5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBuildInfoFactory.java
@@ -59,28 +59,31 @@
 
   @Override
   public final BuildInfoCollection create(BuildInfoContext context, BuildConfiguration config,
-      Artifact stableStatus, Artifact volatileStatus) {
+      Artifact stableStatus, Artifact volatileStatus, RepositoryName repositoryName) {
     WriteBuildInfoPropertiesAction redactedInfo = getHeader(context,
         config,
         BUILD_INFO_REDACTED_PROPERTIES_NAME,
         Artifact.NO_ARTIFACTS,
         createRedactedTranslator(),
         true,
-        true);
+        true,
+        repositoryName);
     WriteBuildInfoPropertiesAction nonvolatileInfo = getHeader(context,
         config,
         BUILD_INFO_NONVOLATILE_PROPERTIES_NAME,
         ImmutableList.of(stableStatus),
         createNonVolatileTranslator(),
         false,
-        true);
+        true,
+        repositoryName);
     WriteBuildInfoPropertiesAction volatileInfo = getHeader(context,
         config,
         BUILD_INFO_VOLATILE_PROPERTIES_NAME,
         ImmutableList.of(volatileStatus),
         createVolatileTranslator(),
         true,
-        false);
+        false,
+        repositoryName);
     List<Action> actions = new ArrayList<>(3);
     actions.add(redactedInfo);
     actions.add(nonvolatileInfo);
@@ -119,8 +122,9 @@
       ImmutableList<Artifact> inputs,
       BuildInfoPropertiesTranslator translator,
       boolean includeVolatile,
-      boolean includeNonVolatile) {
-    Root outputPath = config.getIncludeDirectory(RepositoryName.MAIN);
+      boolean includeNonVolatile,
+      RepositoryName repositoryName) {
+    Root outputPath = config.getIncludeDirectory(repositoryName);
     final Artifact output = context.getBuildInfoArtifact(propertyFileName, outputPath,
         includeVolatile && !inputs.isEmpty() ? BuildInfoType.NO_REBUILD
             : BuildInfoType.FORCE_REBUILD_IF_CHANGED);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBuildInfoFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBuildInfoFactory.java
index 032b900..4397dd9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBuildInfoFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBuildInfoFactory.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 
 /**
  * Objc build info creation - passes on BuildInfo output file for consumption from Objc rules.
@@ -33,7 +34,7 @@
    */
   @Override
   public BuildInfoCollection create(BuildInfoContext context, BuildConfiguration config,
-      Artifact buildInfo, Artifact buildChangelist) {
+      Artifact buildInfo, Artifact buildChangelist, RepositoryName repositoryName) {
     return new BuildInfoCollection(
         ImmutableList.<Action>of(),
         ImmutableList.of(buildInfo),
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
index 652fc82..1d5d2b3 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoContext;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoType;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.skyframe.BuildInfoCollectionValue.BuildInfoKeyAndConfig;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -54,6 +55,13 @@
     if (buildInfoFactories == null) {
       return null;
     }
+    WorkspaceNameValue nameValue = (WorkspaceNameValue) env.getValue(WorkspaceNameValue.key());
+    if (nameValue == null) {
+      return null;
+    }
+    RepositoryName repositoryName = RepositoryName.createFromValidStrippedName(
+        nameValue.maybeGetName());
+
     final ArtifactFactory factory = artifactFactory.get();
     BuildInfoContext context = new BuildInfoContext() {
       @Override
@@ -65,9 +73,9 @@
       }
     };
 
-    return new BuildInfoCollectionValue(buildInfoFactories.get(
-        keyAndConfig.getInfoKey()).create(context, keyAndConfig.getConfig(),
-            infoArtifactValue.getStableArtifact(), infoArtifactValue.getVolatileArtifact()));
+    return new BuildInfoCollectionValue(buildInfoFactories.get(keyAndConfig.getInfoKey()).create(
+        context, keyAndConfig.getConfig(), infoArtifactValue.getStableArtifact(),
+        infoArtifactValue.getVolatileArtifact(), repositoryName));
   }
 
   @Override