Add Artifact#getRepositoryRelativePath with its first set of use cases.
PiperOrigin-RevId: 333509572
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Actions.java b/src/main/java/com/google/devtools/build/lib/actions/Actions.java
index 87cd45b..1cb9fad 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Actions.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Actions.java
@@ -274,11 +274,11 @@
outputFileNames != null ? ImmutableMap.builderWithExpectedSize(outputFiles.size()) : null;
@Nullable Label label = actionLookupKey.getLabel();
@Nullable
- PathFragment packageDirectory =
+ PathFragment packageName =
outputFileNames != null
? Preconditions.checkNotNull(label, actionLookupKey)
.getPackageIdentifier()
- .getPackagePath()
+ .getPackageFragment()
: null;
// Loop over the actions, looking at all outputs for conflicts.
int actionIndex = 0;
@@ -309,9 +309,9 @@
} else {
// No: populate the output label map with this artifact if applicable: if this
// artifact corresponds to a target that is an OutputFile with associated rule this label.
- PathFragment ouputPath = output.getOutputDirRelativePath();
- if (packageDirectory != null && ouputPath.startsWith(packageDirectory)) {
- PathFragment packageRelativePath = ouputPath.relativeTo(packageDirectory);
+ PathFragment outputPath = output.getRepositoryRelativePath();
+ if (packageName != null && outputPath.startsWith(packageName)) {
+ PathFragment packageRelativePath = outputPath.relativeTo(packageName);
Label outputLabel = outputFileNames.get(packageRelativePath.getPathString());
if (outputLabel != null) {
artifactsByOutputLabel.put(outputLabel, artifact);
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index 27f3abf..c340d1b 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -652,6 +652,18 @@
return getPathForLocationExpansion();
}
+ /**
+ * Returns the path to this artifact relative to its repository root. As a result, the returned
+ * path always starts with a corresponding package name, if exists.
+ */
+ public PathFragment getRepositoryRelativePath() {
+ PathFragment fullPath = getPathForLocationExpansion();
+ // We can't use root.isExternalSource() here since it needs to handle derived artifacts too.
+ return fullPath.startsWith(LabelConstants.EXTERNAL_PATH_PREFIX)
+ ? fullPath.subFragment(2)
+ : fullPath;
+ }
+
/** Returns this.getExecPath().getPathString(). */
@Override
public final String getExecPathString() {
@@ -666,6 +678,10 @@
return getOutputDirRelativePath().getPathString();
}
+ public final String getRepositoryRelativePathString() {
+ return getRepositoryRelativePath().getPathString();
+ }
+
@Override
public boolean contentBasedPath() {
return false;
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
index c3bb114..b506e3f 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
@@ -715,7 +715,7 @@
&& !ruleContext.attributes().isAttributeValueExplicitlySpecified("args")) {
ImmutableList.Builder<String> builder = ImmutableList.builder();
for (Artifact artifact : sources) {
- PathFragment path = artifact.getOutputDirRelativePath();
+ PathFragment path = artifact.getRepositoryRelativePath();
String className = JavaUtil.getJavaFullClassname(FileSystemUtils.removeExtension(path));
if (className != null) {
builder.add(className);