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");