diff options
author | Kristina Chodorow <kchodorow@google.com> | 2015-05-29 14:51:31 +0000 |
---|---|---|
committer | Philipp Wollermann <philwo@google.com> | 2015-06-01 15:48:37 +0000 |
commit | 70d5dd0346e85a00b0a13e09371cd235b5d5d7b3 (patch) | |
tree | d0eaf4ff74c712856d0125cefd604c6f39bd9a11 /src/main/java/com/google/devtools/build/lib | |
parent | 4d359804145178dee2067a8023253626d9b12379 (diff) |
Add support for @foo//:bar-format labels on the command line
It's annoying how split up the Label parsing code is, but it seems like too much
work to bother fixing. Maybe next fixit.
--
MOS_MIGRATED_REVID=94758275
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
3 files changed, 30 insertions, 12 deletions
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 0458469314..7d56f52ece 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 @@ -206,6 +206,13 @@ public final class LabelValidator { } /** + * Returns if the label starts with a repository (@whatever) or a package (//whatever). + */ + public static boolean isAbsolute(String label) { + return label.startsWith("//") || label.startsWith("@"); + } + + /** * Parses the given absolute label by verifying that it starts with "//". If it contains a ':', * then the part after that is the target name within the package, and the part before that (but * without the leading "//") is the package name. However, it performs no validation on these two @@ -217,9 +224,16 @@ public final class LabelValidator { * @throws BadLabelException if {@code absName} starts with "//" */ public static PackageAndTarget parseAbsoluteLabel(String absName) throws BadLabelException { - if (!absName.startsWith("//")) { + if (!isAbsolute(absName)) { throw new BadLabelException("invalid label: " + absName); } + if (absName.startsWith("@")) { + int endOfRepo = absName.indexOf("//"); + if (endOfRepo < 0) { + throw new BadLabelException("invalid fully-qualified label: " + absName); + } + absName = absName.substring(endOfRepo); + } // Find the package/suffix separation: int colonIndex = absName.indexOf(':'); int splitAt = colonIndex >= 0 ? colonIndex : absName.length(); 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 dee9659e8d..c10b252227 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 @@ -81,6 +81,7 @@ public abstract class TargetPattern implements Serializable { @VisibleForTesting static String normalize(String path) { Preconditions.checkArgument(!path.startsWith("/")); + Preconditions.checkArgument(!path.startsWith("@")); Iterator<String> it = SLASH_SPLITTER.split(path).iterator(); List<String> pieces = new ArrayList<>(); while (it.hasNext()) { @@ -502,6 +503,16 @@ public abstract class TargetPattern implements Serializable { // constant (see lib/blaze/commands/target-syntax.txt). String originalPattern = pattern; + final boolean includesRepo = pattern.startsWith("@"); + String repoName = ""; + if (includesRepo) { + int pkgStart = pattern.indexOf("//"); + if (pkgStart < 0) { + throw new TargetParsingException("Couldn't find package in target " + pattern); + } + repoName = pattern.substring(0, pkgStart); + pattern = pattern.substring(pkgStart); + } final boolean isAbsolute = pattern.startsWith("//"); // We now absolutize non-absolute target patterns. @@ -553,9 +564,9 @@ public abstract class TargetPattern implements Serializable { } - if (isAbsolute || pattern.contains(":")) { + if (includesRepo || isAbsolute || pattern.contains(":")) { PackageAndTarget packageAndTarget; - String fullLabel = "//" + pattern; + String fullLabel = repoName + "//" + pattern; try { packageAndTarget = LabelValidator.validateAbsoluteLabel(fullLabel); } catch (BadLabelException e) { diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Label.java b/src/main/java/com/google/devtools/build/lib/syntax/Label.java index e1c28aa53f..5a744c0f6a 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/Label.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/Label.java @@ -135,7 +135,7 @@ public final class Label implements Comparable<Label>, Serializable { public static Label parseCommandLineLabel(String label, PathFragment workspaceRelativePath) throws SyntaxException { Preconditions.checkArgument(!workspaceRelativePath.isAbsolute()); - if (isAbsolute(label)) { + if (LabelValidator.isAbsolute(label)) { return parseAbsolute(label); } int index = label.indexOf(':'); @@ -150,13 +150,6 @@ public final class Label implements Comparable<Label>, Serializable { } /** - * Returns if the label starts with a repository (@whatever) or a package (//whatever). - */ - private static boolean isAbsolute(String label) { - return label.startsWith("//") || label.startsWith("@"); - } - - /** * Validates the given target name and returns a canonical String instance if it is valid. * Otherwise it throws a SyntaxException. */ @@ -351,7 +344,7 @@ public final class Label implements Comparable<Label>, Serializable { if (relName.length() == 0) { throw new SyntaxException("empty package-relative label"); } - if (isAbsolute(relName)) { + if (LabelValidator.isAbsolute(relName)) { return parseAbsolute(relName); } else if (relName.equals(":")) { throw new SyntaxException("':' is not a valid package-relative label"); |