Do glob result sorting and @-escaping at the last moment.
c4f2d80270f1ce947fcf7fb0a4e5f0afb3a7062d changed legacy globbing (without a test) to prepend ':' to any targets starting with '@'. It did not change the skyframe globbing logic, which means incrementality bugs. Fix this issue by doing the escaping just before glob() returns its result, which is a common path for both glob implementations.
Fixes https://github.com/bazelbuild/bazel/issues/10606.
Closes #10610.
PiperOrigin-RevId: 292569236
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index 9bd8252..84d2681 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -360,6 +360,23 @@
assertSrcs(validPackageWithoutErrors(skyKey), "foo", "//foo:a.config", "//foo:b.txt");
}
+ @Test
+ public void globEscapesAt() throws Exception {
+ scratch.file("foo/BUILD", "filegroup(name = 'foo', srcs = glob(['*.txt']))");
+ scratch.file("foo/@f.txt");
+ preparePackageLoading(rootDirectory);
+ SkyKey skyKey = PackageValue.key(PackageIdentifier.parse("@//foo"));
+ assertSrcs(validPackageWithoutErrors(skyKey), "foo", "//foo:@f.txt");
+
+ scratch.overwriteFile("foo/BUILD", "filegroup(name = 'foo', srcs = glob(['*.txt'])) # comment");
+ getSkyframeExecutor()
+ .invalidateFilesUnderPathForTesting(
+ reporter,
+ ModifiedFileSet.builder().modify(PathFragment.create("foo/BUILD")).build(),
+ Root.fromPath(rootDirectory));
+ assertSrcs(validPackageWithoutErrors(skyKey), "foo", "//foo:@f.txt");
+ }
+
/**
* Tests that a symlink to a file outside of the package root is handled consistently. If the
* default behavior of Bazel was changed from {@code