Skip to content

Commit 911eedc

Browse files
Wyveraldcopybara-github
authored andcommitted
Fix label unambiguous canonical form to correctly report non-visible repo names
This also affects Starlark `str(some_label)`. Fixes bazelbuild#17258 PiperOrigin-RevId: 503413176 Change-Id: I864c3c892233ede19b2478c3d9e1c806e4b43c11
1 parent 33fed24 commit 911eedc

File tree

3 files changed

+49
-28
lines changed

3 files changed

+49
-28
lines changed

src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public String getCanonicalForm() {
183183
* package.
184184
*/
185185
public String getUnambiguousCanonicalForm() {
186-
return String.format("@@%s//%s", getRepository().getName(), getPackageFragment());
186+
return String.format("@%s//%s", getRepository().getNameWithAt(), getPackageFragment());
187187
}
188188

189189
/**

src/test/java/com/google/devtools/build/lib/cmdline/LabelTest.java

+32-27
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@
2929
import org.junit.runner.RunWith;
3030
import org.junit.runners.JUnit4;
3131

32-
/**
33-
* Tests for {@link Label}.
34-
*/
32+
/** Tests for {@link Label}. */
3533
@RunWith(JUnit4.class)
3634
public class LabelTest {
3735

@@ -175,10 +173,7 @@ public void testIdentities() throws Exception {
175173
Label l2 = Label.parseCanonical("//foo/bar:baz");
176174
Label l3 = Label.parseCanonical("//foo/bar:quux");
177175

178-
new EqualsTester()
179-
.addEqualityGroup(l1, l2)
180-
.addEqualityGroup(l3)
181-
.testEquals();
176+
new EqualsTester().addEqualityGroup(l1, l2).addEqualityGroup(l3).testEquals();
182177
}
183178

184179
@Test
@@ -225,6 +220,7 @@ public void testDotDot() throws Exception {
225220

226221
/**
227222
* Asserts that creating a label throws a SyntaxException.
223+
*
228224
* @param label the label to create.
229225
*/
230226
private static void assertSyntaxError(String expectedError, String label) {
@@ -238,12 +234,9 @@ private static void assertSyntaxError(String expectedError, String label) {
238234

239235
@Test
240236
public void testBadCharacters() throws Exception {
241-
assertSyntaxError("target names may not contain ':'",
242-
"//foo:bar:baz");
243-
assertSyntaxError("target names may not contain ':'",
244-
"//foo:bar:");
245-
assertSyntaxError("target names may not contain ':'",
246-
"//foo/bar::");
237+
assertSyntaxError("target names may not contain ':'", "//foo:bar:baz");
238+
assertSyntaxError("target names may not contain ':'", "//foo:bar:");
239+
assertSyntaxError("target names may not contain ':'", "//foo/bar::");
247240
}
248241

249242
@Test
@@ -267,9 +260,9 @@ public void testDotAsAPathSegment() throws Exception {
267260
assertSyntaxError(INVALID_TARGET_NAME, "//foo:./bar/baz");
268261
// TODO(bazel-team): enable when we have removed the "Workaround" in Label
269262
// that rewrites broken Labels by removing the trailing '.'
270-
//assertSyntaxError(INVALID_PACKAGE_NAME,
263+
// assertSyntaxError(INVALID_PACKAGE_NAME,
271264
// "//foo:bar/baz/.");
272-
//assertSyntaxError(INVALID_PACKAGE_NAME,
265+
// assertSyntaxError(INVALID_PACKAGE_NAME,
273266
// "//foo:.");
274267
}
275268

@@ -280,11 +273,9 @@ public void testTrailingDotSegment() throws Exception {
280273

281274
@Test
282275
public void testSomeOtherBadLabels() throws Exception {
283-
assertSyntaxError("package names may not end with '/'",
284-
"//foo/:bar");
276+
assertSyntaxError("package names may not end with '/'", "//foo/:bar");
285277
assertSyntaxError("package names may not start with '/'", "///p:foo");
286-
assertSyntaxError("package names may not contain '//' path separators",
287-
"//a//b:foo");
278+
assertSyntaxError("package names may not contain '//' path separators", "//a//b:foo");
288279
}
289280

290281
@Test
@@ -305,24 +296,22 @@ public void testSomeGoodLabels() throws Exception {
305296

306297
@Test
307298
public void testDoubleSlashPathSeparator() throws Exception {
308-
assertSyntaxError("package names may not contain '//' path separators",
309-
"//foo//bar:baz");
310-
assertSyntaxError("target names may not contain '//' path separator",
311-
"//foo:bar//baz");
299+
assertSyntaxError("package names may not contain '//' path separators", "//foo//bar:baz");
300+
assertSyntaxError("target names may not contain '//' path separator", "//foo:bar//baz");
312301
}
313302

314303
@Test
315304
public void testNonPrintableCharacters() throws Exception {
316305
assertSyntaxError(
317-
"target names may not contain non-printable characters: '\\x02'",
318-
"//foo:..\002bar");
306+
"target names may not contain non-printable characters: '\\x02'", "//foo:..\002bar");
319307
}
320308

321309
/** Make sure that control characters - such as CR - are escaped on output. */
322310
@Test
323311
public void testInvalidLineEndings() throws Exception {
324-
assertSyntaxError("invalid target name '..bar\\r': "
325-
+ "target names may not end with carriage returns", "//foo:..bar\r");
312+
assertSyntaxError(
313+
"invalid target name '..bar\\r': " + "target names may not end with carriage returns",
314+
"//foo:..bar\r");
326315
}
327316

328317
@Test
@@ -391,6 +380,22 @@ public void testWorkspaceName() throws Exception {
391380
assertThat(Label.parseCanonical("@//bar:baz").getWorkspaceName()).isEmpty();
392381
}
393382

383+
@Test
384+
public void testUnambiguousCanonicalForm() throws Exception {
385+
assertThat(Label.parseCanonical("//foo/bar:baz").getUnambiguousCanonicalForm())
386+
.isEqualTo("@@//foo/bar:baz");
387+
assertThat(Label.parseCanonical("@foo//bar:baz").getUnambiguousCanonicalForm())
388+
.isEqualTo("@@foo//bar:baz");
389+
assertThat(
390+
Label.create(
391+
PackageIdentifier.create(
392+
RepositoryName.create("foo").toNonVisible(RepositoryName.create("bar")),
393+
PathFragment.create("baz")),
394+
"quux")
395+
.getUnambiguousCanonicalForm())
396+
.isEqualTo("@@[unknown repo 'foo' requested from @bar]//baz:quux");
397+
}
398+
394399
@Test
395400
public void starlarkStrAndRepr() throws Exception {
396401
Label label = Label.parseCanonical("//x");

src/test/java/com/google/devtools/build/lib/cmdline/PackageIdentifierTest.java

+16
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,22 @@ public void testRunfilesDir() throws Exception {
9393
.isEqualTo(PathFragment.create("bar/baz"));
9494
}
9595

96+
@Test
97+
public void testUnambiguousCanonicalForm() throws Exception {
98+
assertThat(PackageIdentifier.createInMainRepo("foo/bar").getUnambiguousCanonicalForm())
99+
.isEqualTo("@@//foo/bar");
100+
assertThat(
101+
PackageIdentifier.create("foo", PathFragment.create("bar"))
102+
.getUnambiguousCanonicalForm())
103+
.isEqualTo("@@foo//bar");
104+
assertThat(
105+
PackageIdentifier.create(
106+
RepositoryName.create("foo").toNonVisible(RepositoryName.create("bar")),
107+
PathFragment.create("baz"))
108+
.getUnambiguousCanonicalForm())
109+
.isEqualTo("@@[unknown repo 'foo' requested from @bar]//baz");
110+
}
111+
96112
@Test
97113
public void testDisplayFormInMainRepository() throws Exception {
98114
PackageIdentifier pkg =

0 commit comments

Comments
 (0)