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