Change RegexFilter so order of regexes does not matter.
See https://github.com/bazelbuild/bazel/commit/3a8da9268ffa9c814de4ce4bc1b0e349b37072a5 for why we should normalize.
RELNOTES: None.
PiperOrigin-RevId: 509603421
Change-Id: I161ce17af09ac7fc271667166078f5b78f366296
diff --git a/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java b/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java
index 61f0579..301d241 100644
--- a/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/util/RegexFilter.java
@@ -21,6 +21,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.TreeSet;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
@@ -110,9 +111,10 @@
if (regexList.isEmpty()) {
return null;
}
+ TreeSet<String> deduped = new TreeSet<>(regexList);
// Wraps each individual regex into an independent group, then combines them using '|' and
// wraps the result in a non-capturing group.
- return Pattern.compile("(?:(?>" + Joiner.on(")|(?>").join(regexList) + "))");
+ return Pattern.compile("(?:(?>" + Joiner.on(")|(?>").join(deduped) + "))");
}
/**
diff --git a/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java b/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java
index f63c31e..e2b430c 100644
--- a/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/RegexFilterTest.java
@@ -61,7 +61,7 @@
@Test
public void inclusions() throws Exception {
createFilter("a/b,+^c,_test$");
- assertThat(filter.toString()).isEqualTo("(?:(?>a/b)|(?>^c)|(?>_test$))");
+ assertThat(filter.toString()).isEqualTo("(?:(?>^c)|(?>_test$)|(?>a/b))");
assertIncluded("a/b");
assertIncluded("a/b/c");
assertIncluded("c");
@@ -78,7 +78,7 @@
@Test
public void exclusions() throws Exception {
createFilter("-a/b,-^c,-_test$");
- assertThat(filter.toString()).isEqualTo("-(?:(?>a/b)|(?>^c)|(?>_test$))");
+ assertThat(filter.toString()).isEqualTo("-(?:(?>^c)|(?>_test$)|(?>a/b))");
assertExcluded("a/b");
assertExcluded("a/b/c");
assertExcluded("c");
@@ -96,7 +96,7 @@
public void inclusionsAndExclusions() throws Exception {
createFilter("a,-^c,,-,+,d,+a/b/c,-a/b,a/b/d");
assertThat(filter.toString())
- .isEqualTo("(?:(?>a)|(?>d)|(?>a/b/c)|(?>a/b/d)),-(?:(?>^c)|(?>a/b))");
+ .isEqualTo("(?:(?>a)|(?>a/b/c)|(?>a/b/d)|(?>d)),-(?:(?>^c)|(?>a/b))");
assertIncluded("a");
assertIncluded("a/c");
assertExcluded("a/b");