Allow Reporter to take events with a "showOnce" tag to suppress handling of
duplicate events.
PiperOrigin-RevId: 240172573
diff --git a/src/main/java/com/google/devtools/build/lib/events/Reporter.java b/src/main/java/com/google/devtools/build/lib/events/Reporter.java
index 376773f..1e0bf85 100644
--- a/src/main/java/com/google/devtools/build/lib/events/Reporter.java
+++ b/src/main/java/com/google/devtools/build/lib/events/Reporter.java
@@ -18,6 +18,7 @@
import com.google.common.eventbus.EventBus;
import com.google.devtools.build.lib.util.io.OutErr;
import java.io.PrintStream;
+import java.util.HashSet;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
@@ -56,6 +57,13 @@
private EventHandler ansiAllowingHandler;
private EventHandler ansiStrippingHandler;
private boolean ansiAllowingHandlerRegistered;
+ private final HashSet<String> eventsShown = new HashSet<>();
+
+ /**
+ * The tag that indicates to the reporter to suppress this event if it's a duplicate of another
+ * event with this tag.
+ */
+ public static final String SHOW_ONCE_TAG = "showOnce";
public Reporter(EventBus eventBus) {
this.eventBus = eventBus;
@@ -121,6 +129,13 @@
return;
}
+ if (SHOW_ONCE_TAG.equals(e.getTag())) {
+ if (eventsShown.contains(e.toString())) {
+ return;
+ }
+ eventsShown.add(e.toString());
+ }
+
for (EventHandler handler : eventHandlers) {
handler.handle(e);
}
diff --git a/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java b/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
index 63e8751..aea3f7b 100644
--- a/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/ReporterTest.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.events;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.devtools.build.lib.events.Reporter.SHOW_ONCE_TAG;
import com.google.common.collect.ImmutableList;
import com.google.common.eventbus.EventBus;
@@ -71,6 +72,23 @@
}
@Test
+ public void reporterIgnoresDuplicateEventsWithShowOnce() {
+ ImmutableList<Event> duplicates =
+ ImmutableList.of(
+ Event.warn("ShowMeOnce").withTag(SHOW_ONCE_TAG),
+ Event.warn("ShowMeOnce").withTag(SHOW_ONCE_TAG),
+ Event.warn("ShowMeOnce").withTag(SHOW_ONCE_TAG),
+ Event.warn("ShowMeOnce").withTag(SHOW_ONCE_TAG));
+ EventCollector collector = new EventCollector();
+ reporter.addHandler(collector);
+ for (Event e : duplicates) {
+ reporter.handle(e);
+ }
+ ImmutableList<Event> got = ImmutableList.copyOf(collector);
+ assertThat(got).containsExactly(Event.warn("ShowMeOnce").withTag(SHOW_ONCE_TAG));
+ }
+
+ @Test
public void reporterCopyConstructorCopiesHandlersList() {
reporter.addHandler(outAppender);
reporter.addHandler(outAppender);