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);