diff options
author | twerth <twerth@google.com> | 2018-06-14 05:17:15 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-14 05:18:39 -0700 |
commit | 1615da781db78b7a910daf89720189c2b2e73dbe (patch) | |
tree | afa7a839c1de159fde355f665736f92f8927e613 /src/main/java/com/google/devtools/build/lib/cmdline | |
parent | 77459d98103f9fd788226539a3ab318f829b1017 (diff) |
Allow @ in package names.
To disambiguate:
- @foo refers to the external dependency @foo//:foo (as before this change).
- //@foo refers to the target //@foo:@foo (i.e. in the default workspace).
RELNOTES[NEW]: Allow @ in package names.
PiperOrigin-RevId: 200541716
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/cmdline')
3 files changed, 43 insertions, 15 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java index 9d14e6d7d8..6f238429eb 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java @@ -155,17 +155,22 @@ public final class Label repo = absName; absName = "//:" + absName.substring(1); } + String error = RepositoryName.validate(repo); + if (error != null) { + throw new LabelSyntaxException( + "invalid repository name '" + StringUtilities.sanitizeControlChars(repo) + "': " + error); + } try { LabelValidator.PackageAndTarget labelParts = LabelValidator.parseAbsoluteLabel(absName); - PackageIdentifier pkgIdWithoutRepo = - validatePackageName(labelParts.getPackageName(), labelParts.getTargetName()); - PathFragment packageFragment = pkgIdWithoutRepo.getPackageFragment(); + PackageIdentifier pkgId = + validatePackageName( + labelParts.getPackageName(), labelParts.getTargetName(), repo, repositoryMapping); + PathFragment packageFragment = pkgId.getPackageFragment(); if (repo.isEmpty() && ABSOLUTE_PACKAGE_NAMES.contains(packageFragment)) { - repo = "@"; + pkgId = + PackageIdentifier.create(getGlobalRepoName("@", repositoryMapping), packageFragment); } - RepositoryName globalRepoName = getGlobalRepoName(repo, repositoryMapping); - return create( - PackageIdentifier.create(globalRepoName, packageFragment), labelParts.getTargetName()); + return create(pkgId, labelParts.getTargetName()); } catch (BadLabelException e) { throw new LabelSyntaxException(e.getMessage()); } @@ -289,15 +294,25 @@ public final class Label return name; } + private static PackageIdentifier validatePackageName(String packageIdentifier, String name) + throws LabelSyntaxException { + return validatePackageName( + packageIdentifier, name, /* repo= */ null, /* repositoryMapping= */ null); + } + /** * Validates the given package name and returns a canonical {@link PackageIdentifier} instance if * it is valid. Otherwise it throws a SyntaxException. */ - private static PackageIdentifier validatePackageName(String packageIdentifier, String name) + private static PackageIdentifier validatePackageName( + String packageIdentifier, + String name, + String repo, + ImmutableMap<RepositoryName, RepositoryName> repositoryMapping) throws LabelSyntaxException { String error = null; try { - return PackageIdentifier.parse(packageIdentifier); + return PackageIdentifier.parse(packageIdentifier, repo, repositoryMapping); } catch (LabelSyntaxException e) { error = e.getMessage(); error = "invalid package name '" + packageIdentifier + "': " + error; diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/LabelValidator.java b/src/main/java/com/google/devtools/build/lib/cmdline/LabelValidator.java index 633946c60f..e63b09684a 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/LabelValidator.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/LabelValidator.java @@ -45,7 +45,6 @@ public final class LabelValidator { // Package names allow all 7-bit ASCII characters except // 0-31 (control characters) // 58 ':' (colon) - target name separator - // 64 '@' (at-sign) - workspace name prefix // 92 '\' (backslash) - directory separator (on Windows); may be allowed in the future // 127 (delete) /** Matches characters allowed in package name. */ @@ -53,7 +52,7 @@ public final class LabelValidator { CharMatcher.inRange('0', '9') .or(CharMatcher.inRange('a', 'z')) .or(CharMatcher.inRange('A', 'Z')) - .or(CharMatcher.anyOf(" !\"#$%&'()*+,-./;<=>?[]^_`{|}~")) + .or(CharMatcher.anyOf(" !\"#$%&'()*+,-./;<=>?@[]^_`{|}~")) .precomputed(); /** @@ -71,7 +70,7 @@ public final class LabelValidator { @VisibleForTesting static final String PACKAGE_NAME_ERROR = "package names may contain A-Z, a-z, 0-9, or any of ' !\"#$%&'()*+,-./;<=>?[]^_`{|}~'" - + " (most 127-bit ascii characters except 0-31, 127, ':', '@', or '\\')"; + + " (most 127-bit ascii characters except 0-31, 127, ':', or '\\')"; @VisibleForTesting static final String PACKAGE_NAME_DOT_ERROR = diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java index 8d7ad1910a..732e6a0642 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.cmdline; import com.google.common.base.Preconditions; import com.google.common.collect.ComparisonChain; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Interner; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; @@ -119,10 +120,17 @@ public final class PackageIdentifier } public static PackageIdentifier parse(String input) throws LabelSyntaxException { - String repo; + return parse(input, /* repo= */ null, /* repositoryMapping= */ null); + } + + public static PackageIdentifier parse( + String input, String repo, ImmutableMap<RepositoryName, RepositoryName> repositoryMapping) + throws LabelSyntaxException { String packageName; int packageStartPos = input.indexOf("//"); - if (input.startsWith("@") && packageStartPos > 0) { + if (repo != null) { + packageName = input; + } else if (input.startsWith("@") && packageStartPos > 0) { repo = input.substring(0, packageStartPos); packageName = input.substring(packageStartPos + 2); } else if (input.startsWith("@")) { @@ -145,7 +153,13 @@ public final class PackageIdentifier throw new LabelSyntaxException(error); } - return create(repo, PathFragment.create(packageName)); + if (repositoryMapping != null) { + RepositoryName repositoryName = RepositoryName.create(repo); + repositoryName = repositoryMapping.getOrDefault(repositoryName, repositoryName); + return create(repositoryName, PathFragment.create(packageName)); + } else { + return create(repo, PathFragment.create(packageName)); + } } public RepositoryName getRepository() { |