From 0ca44769ea775485aac177664a13d4e178fa037b Mon Sep 17 00:00:00 2001 From: Kristina Chodorow Date: Fri, 3 Mar 2017 14:06:45 +0000 Subject: 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 --- .../build/lib/analysis/buildinfo/BuildInfoFactory.java | 9 +++++---- .../devtools/build/lib/cmdline/RepositoryName.java | 12 ++++++++++++ .../devtools/build/lib/rules/cpp/CppBuildInfo.java | 12 ++++++------ .../build/lib/rules/java/JavaBuildInfoFactory.java | 16 ++++++++++------ .../build/lib/rules/objc/ObjcBuildInfoFactory.java | 3 ++- .../build/lib/skyframe/BuildInfoCollectionFunction.java | 14 +++++++++++--- 6 files changed, 46 insertions(+), 20 deletions(-) (limited to 'src/main/java/com') 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 2a4b4caf1f..07e991818e 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 @@ package com.google.devtools.build.lib.analysis.buildinfo; 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 @@ public interface BuildInfoFactory extends Serializable { /** * 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 @@ public interface BuildInfoFactory extends Serializable { /** * 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 @@ public interface BuildInfoFactory extends Serializable { * 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 @@ public interface BuildInfoFactory extends Serializable { * 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 ba0f6b407b..ae1fe70270 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 @@ -118,6 +118,18 @@ public final class RepositoryName implements Serializable { } } + /** + * 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 71be3461fd..30a5515b3e 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 @@ public final class CppBuildInfo implements BuildInfoFactory { @Override public BuildInfoCollection create(BuildInfoContext buildInfoContext, BuildConfiguration config, - Artifact buildInfo, Artifact buildChangelist) { + Artifact buildInfo, Artifact buildChangelist, RepositoryName repositoryName) { List 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 @@ public final class CppBuildInfo implements BuildInfoFactory { private WriteBuildInfoHeaderAction getHeader(BuildInfoContext buildInfoContext, BuildConfiguration config, PathFragment headerName, Collection 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 3ab7bde2b5..95e1cc5a5d 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 @@ public abstract class JavaBuildInfoFactory implements BuildInfoFactory { @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 actions = new ArrayList<>(3); actions.add(redactedInfo); actions.add(nonvolatileInfo); @@ -119,8 +122,9 @@ public abstract class JavaBuildInfoFactory implements BuildInfoFactory { ImmutableList 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 032b9009cf..4397dd9ef8 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.actions.Artifact; 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 @@ public class ObjcBuildInfoFactory implements BuildInfoFactory { */ @Override public BuildInfoCollection create(BuildInfoContext context, BuildConfiguration config, - Artifact buildInfo, Artifact buildChangelist) { + Artifact buildInfo, Artifact buildChangelist, RepositoryName repositoryName) { return new BuildInfoCollection( ImmutableList.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 652fc820e4..1d5d2b36c5 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; 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 @@ public class BuildInfoCollectionFunction implements SkyFunction { 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 @@ public class BuildInfoCollectionFunction implements SkyFunction { } }; - 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 -- cgit v1.2.3