aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-02-12 18:56:02 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-15 09:19:10 +0000
commit500175fcfb37953f50cf0869df164902755807f2 (patch)
treea59b2bda11681e8674d551e235dea1b4655fe578 /src/main/java/com/google/devtools/build
parentb0ee77a714511daf1a168a0bf90b096409872555 (diff)
Don't include absolute paths in blaze IDE artifacts
RELNOTES: Don't include absolute paths in blaze IDE artifacts -- MOS_MIGRATED_REVID=114550121
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java46
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java55
2 files changed, 81 insertions, 20 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
index f6d4856374..472bef60f9 100644
--- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
@@ -20,8 +20,10 @@ import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
import com.google.common.base.Function;
+import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.io.ByteSource;
import com.google.devtools.build.lib.Constants;
@@ -56,6 +58,7 @@ import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.BuildType;
+import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.android.AndroidCommon;
import com.google.devtools.build.lib.rules.android.AndroidIdeInfoProvider;
@@ -303,6 +306,9 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
.getPath()
.toString());
+ outputBuilder.setBuildFileArtifactLocation(
+ makeArtifactLocation(ruleContext.getRule().getPackage()));
+
outputBuilder.setKind(ruleKind);
if (ruleKind == Kind.JAVA_LIBRARY
@@ -373,8 +379,7 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
.setExecutable(ruleContext.getExecutablePrerequisite("$packageParser", Mode.HOST))
.setCommandLine(CustomCommandLine.builder()
.addExecPath("--output_manifest", packageManifest)
- .addJoinStrings("--sources_absolute_paths", ":", Artifact.toAbsolutePaths(sourceFiles))
- .addJoinExecPaths("--sources_execution_paths", ":", sourceFiles)
+ .addJoinStrings("--sources", ":", toSerializedArtifactLocations(sourceFiles))
.build())
.useParameterFile(ParameterFileType.SHELL_QUOTED)
.setProgressMessage("Parsing java package strings for " + ruleContext.getRule())
@@ -382,6 +387,25 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
.build(ruleContext);
}
+ private static Iterable<String> toSerializedArtifactLocations(Iterable<Artifact> artifacts) {
+ return Iterables.transform(
+ Iterables.filter(artifacts, Artifact.MIDDLEMAN_FILTER),
+ PACKAGE_PARSER_SERIALIZER);
+ }
+
+ private static final Function<Artifact, String> PACKAGE_PARSER_SERIALIZER =
+ new Function<Artifact, String>() {
+ @Override
+ public String apply(Artifact artifact) {
+ ArtifactLocation location = makeArtifactLocation(artifact);
+ return Joiner.on(",").join(
+ location.getRootExecutionPathFragment(),
+ location.getRelativePath(),
+ location.getRootPath()
+ );
+ }
+ };
+
private static Artifact derivedArtifact(ConfiguredTarget base, RuleContext ruleContext,
String suffix) {
BuildConfiguration configuration = ruleContext.getConfiguration();
@@ -471,16 +495,28 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
}
private static ArtifactLocation makeArtifactLocation(Artifact artifact) {
+ return makeArtifactLocation(artifact.getRoot(), artifact.getRootRelativePath());
+ }
+
+ private static ArtifactLocation makeArtifactLocation(Package pkg) {
+ Root root = Root.asSourceRoot(pkg.getSourceRoot());
+ PathFragment relativePath = pkg.getBuildFile().getPath().relativeTo(root.getPath());
+ return makeArtifactLocation(root, relativePath);
+ }
+
+ private static ArtifactLocation makeArtifactLocation(Root root, PathFragment relativePath) {
return ArtifactLocation.newBuilder()
- .setRootPath(artifact.getRoot().getPath().toString())
- .setRelativePath(artifact.getRootRelativePathString())
- .setIsSource(artifact.isSourceArtifact())
+ .setRootPath(root.getPath().toString())
+ .setRootExecutionPathFragment(root.getExecPath().toString())
+ .setRelativePath(relativePath.toString())
+ .setIsSource(root.isSourceRoot())
.build();
}
private static ArtifactLocation makeArtifactLocation(SourceDirectory resourceDir) {
return ArtifactLocation.newBuilder()
.setRootPath(resourceDir.getRootPath().toString())
+ .setRootExecutionPathFragment(resourceDir.getRootExecutionPathFragment().toString())
.setRelativePath(resourceDir.getRelativePath().toString())
.setIsSource(resourceDir.isSource())
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
index 7028a45eca..0cd44ad59d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.android;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -39,11 +40,29 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
@Immutable
public static class SourceDirectory {
final PathFragment relativePath;
+ final PathFragment rootExecutionPathFragment;
final PathFragment rootPath;
final boolean isSource;
- public SourceDirectory(PathFragment rootPath, PathFragment relativePath, boolean isSource) {
+ @VisibleForTesting
+ public static SourceDirectory fromSourceRoot(
+ PathFragment rootPath,
+ PathFragment relativePath) {
+ return new SourceDirectory(rootPath, PathFragment.EMPTY_FRAGMENT, relativePath, true);
+ }
+
+ public static SourceDirectory fromRoot(Root root, PathFragment relativePath) {
+ return new SourceDirectory(
+ root.getPath().asFragment(), root.getExecPath(), relativePath, root.isSourceRoot());
+ }
+
+ private SourceDirectory(
+ PathFragment rootPath,
+ PathFragment rootExecutionPathFragment,
+ PathFragment relativePath,
+ boolean isSource) {
this.rootPath = rootPath;
+ this.rootExecutionPathFragment = rootExecutionPathFragment;
this.relativePath = relativePath;
this.isSource = isSource;
}
@@ -62,6 +81,14 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
return rootPath;
}
+ /**
+ * The path from the execution root to the actual root. For source roots, this returns
+ * the empty fragment, {@link Root#getExecPath()}.
+ */
+ public PathFragment getRootExecutionPathFragment() {
+ return rootExecutionPathFragment;
+ }
+
/** Indicates if the directory is in the gen files tree. */
public boolean isSource() {
return isSource;
@@ -69,7 +96,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
@Override
public int hashCode() {
- return Objects.hash(relativePath, rootPath, isSource);
+ return Objects.hash(relativePath, rootPath, rootExecutionPathFragment, isSource);
}
@Override
@@ -77,6 +104,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
if (other instanceof SourceDirectory) {
SourceDirectory otherDir = (SourceDirectory) other;
return Objects.equals(rootPath, otherDir.rootPath)
+ && Objects.equals(rootExecutionPathFragment, otherDir.rootExecutionPathFragment)
&& Objects.equals(relativePath, otherDir.relativePath)
&& Objects.equals(isSource, otherDir.isSource);
}
@@ -86,7 +114,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
@Override
public String toString() {
return "SourceDirectory [relativePath=" + relativePath + ", rootPath=" + rootPath
- + ", isSource=" + isSource + "]";
+ + ", executionRootPrefix=" + rootExecutionPathFragment + ", isSource=" + isSource + "]";
}
}
@@ -179,10 +207,9 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
private void addIdlDirs(Collection<Artifact> idlArtifacts) {
for (Artifact idl : idlArtifacts) {
this.idlDirs.add(
- new SourceDirectory(
- idl.getRoot().getPath().asFragment(),
- idl.getRootRelativePath().getParentDirectory(),
- idl.isSourceArtifact()));
+ SourceDirectory.fromRoot(
+ idl.getRoot(),
+ idl.getRootRelativePath().getParentDirectory()));
}
}
@@ -199,10 +226,9 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
public Builder addResourceSource(Artifact resource) {
PathFragment resourceDir = LocalResourceContainer.Builder.findResourceDir(resource);
resourceDirs.add(
- new SourceDirectory(
- resource.getRoot().getPath().asFragment(),
- trimTo(resource.getRootRelativePath(), resourceDir),
- resource.isSourceArtifact()));
+ SourceDirectory.fromRoot(
+ resource.getRoot(),
+ trimTo(resource.getRootRelativePath(), resourceDir)));
return this;
}
@@ -222,10 +248,9 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider {
public Builder addAssetSource(Artifact asset, PathFragment assetDir) {
assetDirs.add(
- new SourceDirectory(
- asset.getRoot().getPath().asFragment(),
- trimTo(asset.getRootRelativePath(), assetDir),
- asset.isSourceArtifact()));
+ SourceDirectory.fromRoot(
+ asset.getRoot(),
+ trimTo(asset.getRootRelativePath(), assetDir)));
return this;
}