Allow target patterns to use the canonical label literal syntax

With this change, it's possible to run the command line `bazel build @@foo~1.0//:bar`.

PiperOrigin-RevId: 475550743
Change-Id: Ia2159e1061aa02819e916d15f966df692955d464
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
index 93edaa1..d22caa0 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/TargetPattern.java
@@ -911,19 +911,24 @@
           throw new TargetParsingException(
               "Couldn't find package in target " + pattern, TargetPatterns.Code.PACKAGE_NOT_FOUND);
         }
-        String repoPart = pattern.substring(1, pkgStart);
+        boolean isCanonicalRepoName = pattern.startsWith("@@");
+        String repoPart = pattern.substring(isCanonicalRepoName ? 2 : 1, pkgStart);
         try {
           RepositoryName.validate(repoPart);
         } catch (LabelSyntaxException e) {
           throw new TargetParsingException(e.getMessage(), TargetPatterns.Code.LABEL_SYNTAX_ERROR);
         }
-        repository = repoMapping.get(repoPart);
-        if (!repository.isVisible()) {
-          throw new TargetParsingException(
-              String.format(
-                  "Repository '@%s' is not visible from repository '@%s'",
-                  repository.getName(), repository.getOwnerRepoIfNotVisible()),
-              Code.PACKAGE_NOT_FOUND);
+        if (isCanonicalRepoName) {
+          repository = RepositoryName.createUnvalidated(repoPart);
+        } else {
+          repository = repoMapping.get(repoPart);
+          if (!repository.isVisible()) {
+            throw new TargetParsingException(
+                String.format(
+                    "Repository '@%s' is not visible from repository '@%s'",
+                    repository.getName(), repository.getOwnerRepoIfNotVisible()),
+                Code.PACKAGE_NOT_FOUND);
+          }
         }
 
         pattern = pattern.substring(pkgStart);
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java
index f5d253e..1412e0c 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/TargetPatternTest.java
@@ -51,6 +51,8 @@
     parse("@repo//foo:bar");
     parse("@repo//foo:all");
     parse("@repo//:bar");
+    parse("@@repo//foo:all");
+    parse("@@repo//:bar");
   }
 
   @Test
@@ -184,6 +186,7 @@
 
     // No renaming should occur
     assertThat(parser.parse("@//package:target").getRepository().isMain()).isTrue();
+    assertThat(parser.parse("@@foo//package:target").getRepository().getName()).isEqualTo("foo");
     assertThat(parser.parse("@unrelated//package:target").getRepository().getName())
         .isEqualTo("unrelated");
     assertThat(parser.parse("foo/package:target").getRepository().getName()).isEqualTo("myrepo");