Use targets' labels' package identifier for query output=package

Subinclude targets' packages are the package containing the load
statement. Subinclude targets' labels are the bzl files they refer to.
The latter has the appropriate package to display for --output=package.

Fixes #3122.

PiperOrigin-RevId: 159750840
diff --git a/site/docs/query.html b/site/docs/query.html
index 5eb8885..86b4318 100644
--- a/site/docs/query.html
+++ b/site/docs/query.html
@@ -1225,6 +1225,11 @@
 </p>
 
 <p>
+  Packages in external repositories are formatted as
+  <code>@repo//foo/bar</code> while packages in the main repository are
+  formatted as <code>foo/bar</code>.
+</p>
+<p>
   In conjunction with the <code>deps(...)</code> query, this output
   option can be used to find the set of packages that must be checked
   out in order to build a given set of targets.
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
index 3fb451a..48923a3 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
@@ -344,7 +344,7 @@
         public void processOutput(Iterable<Target> partialResult) {
 
           for (Target target : partialResult) {
-            packageNames.add(target.getLabel().getPackageName());
+            packageNames.add(target.getLabel().getPackageIdentifier().toString());
           }
         }
 
diff --git a/src/test/shell/bazel/local_repository_test.sh b/src/test/shell/bazel/local_repository_test.sh
index bc3a08a..d802af5 100755
--- a/src/test/shell/bazel/local_repository_test.sh
+++ b/src/test/shell/bazel/local_repository_test.sh
@@ -427,6 +427,35 @@
   expect_log "//external:my_repo"
 }
 
+function test_repository_package_query() {
+  mkdir a b b/b
+  echo "local_repository(name='b', path='b')" > WORKSPACE
+  echo "sh_library(name='a', deps=['@b//b'])" > a/BUILD
+  touch b/WORKSPACE
+  echo "sh_library(name='b')" > b/b/BUILD
+  bazel query --output package "deps(//a)" >& $TEST_log || fail "query failed"
+  expect_log "a"
+  expect_log "@b//b"
+}
+
+function test_repository_buildfiles_package_query() {
+  mkdir a b b/b b/c
+  echo "local_repository(name='b', path='b')" > WORKSPACE
+  echo "sh_library(name='a', deps=['@b//b'])" > a/BUILD
+  touch b/WORKSPACE b/c/BUILD
+  cat > b/b/BUILD <<EOF
+load('//c:lib.bzl', 'x')
+sh_library(
+    name = "b"
+)
+EOF
+  echo "x = 2" > b/c/lib.bzl
+  bazel query --output package "buildfiles(deps(//a))" >& $TEST_log || fail "query failed"
+  expect_log "a"
+  expect_log "@b//b"
+  expect_log "@b//c"
+}
+
 function test_warning() {
   local bar=$TEST_TMPDIR/bar
   rm -rf "$bar"