aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/cmdline/Label.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/Label.java79
1 files changed, 66 insertions, 13 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 b1bcffa482..030e689b82 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
@@ -48,7 +48,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
* Package names that aren't made relative to the current repository because they mean special
* things to Bazel.
*/
- private static final ImmutableSet<PathFragment> ABSOLUTE_PACKAGE_NAMES = ImmutableSet.of(
+ public static final ImmutableSet<PathFragment> ABSOLUTE_PACKAGE_NAMES = ImmutableSet.of(
// Used for select
new PathFragment("conditions"),
// dependencies that are a function of the configuration
@@ -59,7 +59,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
Label.EXTERNAL_PACKAGE_NAME);
public static final PackageIdentifier EXTERNAL_PACKAGE_IDENTIFIER =
- PackageIdentifier.createInDefaultRepo(EXTERNAL_PACKAGE_NAME);
+ PackageIdentifier.createInMainRepo(EXTERNAL_PACKAGE_NAME);
public static final String EXTERNAL_PATH_PREFIX = "external";
@@ -71,9 +71,28 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
* {@literal @}foo//bar
* {@literal @}foo//bar:baz
* </pre>
+ *
+ * <p>Treats labels in the default repository as being in the main repository instead.
*/
public static Label parseAbsolute(String absName) throws LabelSyntaxException {
- String repo = PackageIdentifier.DEFAULT_REPOSITORY;
+ return parseAbsolute(absName, true);
+ }
+
+ /**
+ * Factory for Labels from absolute string form. e.g.
+ * <pre>
+ * //foo/bar
+ * //foo/bar:quux
+ * {@literal @}foo//bar
+ * {@literal @}foo//bar:baz
+ * </pre>
+ *
+ * @param defaultToMain Treat labels in the default repository as being in the main
+ * one instead.
+ */
+ public static Label parseAbsolute(String absName, boolean defaultToMain)
+ throws LabelSyntaxException {
+ String repo = defaultToMain ? "@" : PackageIdentifier.DEFAULT_REPOSITORY;
int packageStartPos = absName.indexOf("//");
if (packageStartPos > 0) {
repo = absName.substring(0, packageStartPos);
@@ -83,8 +102,12 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
LabelValidator.PackageAndTarget labelParts = LabelValidator.parseAbsoluteLabel(absName);
PackageIdentifier pkgIdWithoutRepo =
validate(labelParts.getPackageName(), labelParts.getTargetName());
+ PathFragment packageFragment = pkgIdWithoutRepo.getPackageFragment();
+ if (repo.isEmpty() && ABSOLUTE_PACKAGE_NAMES.contains(packageFragment)) {
+ repo = "@";
+ }
return new Label(
- PackageIdentifier.create(repo, pkgIdWithoutRepo.getPackageFragment()),
+ PackageIdentifier.create(repo, packageFragment),
labelParts.getTargetName());
} catch (BadLabelException e) {
throw new LabelSyntaxException(e.getMessage());
@@ -98,14 +121,18 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
*
* <p>Do not use this when the argument is not hard-wired.
*/
- public static Label parseAbsoluteUnchecked(String absName) {
+ public static Label parseAbsoluteUnchecked(String absName, boolean defaultToMain) {
try {
- return parseAbsolute(absName);
+ return parseAbsolute(absName, defaultToMain);
} catch (LabelSyntaxException e) {
throw new IllegalArgumentException(e);
}
}
+ public static Label parseAbsoluteUnchecked(String absName) {
+ return parseAbsoluteUnchecked(absName, true);
+ }
+
/**
* Factory for Labels from separate components.
*
@@ -243,7 +270,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
}
private Object writeReplace() {
- return new LabelSerializationProxy(toString());
+ return new LabelSerializationProxy(getUnambiguousCanonicalForm());
}
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
@@ -322,7 +349,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
/**
* Renders this label in canonical form.
*
- * <p>invariant: {@code parseAbsolute(x.toString()).equals(x)}
+ * <p>invariant: {@code parseAbsolute(x.toString(), false).equals(x)}
*/
@Override
public String toString() {
@@ -332,21 +359,46 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
/**
* Renders this label in canonical form.
*
- * <p>invariant: {@code parseAbsolute(x.toString()).equals(x)}
+ * <p>invariant: {@code parseAbsolute(x.getCanonicalForm(), false).equals(x)}
*/
public String getCanonicalForm() {
+ return getDefaultCanonicalForm();
+ }
+
+ public String getUnambiguousCanonicalForm() {
return packageIdentifier.getRepository() + "//" + packageIdentifier.getPackageFragment()
+ ":" + name;
}
/**
+ * Renders this label in canonical form, except with labels in the main and default
+ * repositories conflated.
+ */
+ public String getDefaultCanonicalForm() {
+ String repository;
+ if (packageIdentifier.getRepository().isMain()) {
+ repository = "";
+ } else {
+ repository = packageIdentifier.getRepository().getName();
+ }
+ return repository + "//" + packageIdentifier.getPackageFragment()
+ + ":" + name;
+ }
+
+ /**
* Renders this label in shorthand form.
*
* <p>Labels with canonical form {@code //foo/bar:bar} have the shorthand form {@code //foo/bar}.
* All other labels have identical shorthand and canonical forms.
*/
public String toShorthandString() {
- return packageIdentifier.getRepository() + (getPackageFragment().getBaseName().equals(name)
+ String repository;
+ if (packageIdentifier.getRepository().isMain()) {
+ repository = "";
+ } else {
+ repository = packageIdentifier.getRepository().getName();
+ }
+ return repository + (getPackageFragment().getBaseName().equals(name)
? "//" + getPackageFragment()
: toString());
}
@@ -391,7 +443,7 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
}
if (LabelValidator.isAbsolute(relName)) {
- return resolveRepositoryRelative(parseAbsolute(relName));
+ return resolveRepositoryRelative(parseAbsolute(relName, false));
} else if (relName.equals(":")) {
throw new LabelSyntaxException("':' is not a valid package-relative label");
} else if (relName.charAt(0) == ':') {
@@ -407,11 +459,12 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkPrin
* <p>This is necessary so that dependency edges in remote repositories do not need to explicitly
* mention their repository name. Otherwise, referring to e.g. <code>//a:b</code> in a remote
* repository would point back to the main repository, which is usually not what is intended.
+ *
+ * <p>The return value will not be in the default repository.
*/
public Label resolveRepositoryRelative(Label relative) {
if (packageIdentifier.getRepository().isDefault()
- || !relative.packageIdentifier.getRepository().isDefault()
- || ABSOLUTE_PACKAGE_NAMES.contains(relative.getPackageIdentifier().getPackageFragment())) {
+ || !relative.packageIdentifier.getRepository().isDefault()) {
return relative;
} else {
try {