Don't retain uninteresting flag for transaction end

We want to keep traversing beyond the merge transaction to check for
missing events.

Solves: Jira GER-1613
Change-Id: I3d4ca666f61df5e30117b5d7f0062949d0289d4f
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/UnprocessedCommitsWalker.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/UnprocessedCommitsWalker.java
index aad049f..fb46d82 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/UnprocessedCommitsWalker.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/UnprocessedCommitsWalker.java
@@ -297,7 +297,7 @@
       }
       if (transactionEnd != null
           && eventHub.getExistingId(eventKey.copy(transactionEnd)).isEmpty()) {
-        rw.resetRetain(RevFlag.UNINTERESTING, hasScsEventFlag);
+        rw.resetRetain(hasScsEventFlag);
         transactionEnd.remove(RevFlag.UNINTERESTING);
         rw.markStart(transactionEnd);
         rw.sort(RevSort.TOPO);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
index f3cede7..ab53d14 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
@@ -91,7 +91,7 @@
   }
 
   @Test
-  public void patchSetSubmittedResultsInEvent() throws Exception {
+  public void patchSetSubmittedResultsInEvent_parentHandled() throws Exception {
     markMasterAsHandled(SCC);
     PushOneCommit.Result res = createChange();
     SourceChangeEventKey sccKey = toSccKey(res);
@@ -101,12 +101,56 @@
     merge(res);
     EventKey scsKey = sccKey.copy(SCS);
     EiffelEvent scsEvent = publisher.getPublished(scsKey);
-    assertNotNull("Publisher did not find SCS event", sccEvent);
+    assertNotNull("Publisher did not find SCS event", scsEvent);
     assertEquals(EventKey.fromEvent(scsEvent), scsKey);
     assertScsLinks(Lists.newArrayList(scsParentEventId), sccEvent.meta.id, scsEvent.links);
   }
 
   @Test
+  public void patchSetSubmittedResultsInEvents_parentNotHandled() throws Exception {
+    UUID masterSccEventId = markMasterAsHandled(SCC);
+    RevCommit previousMaster = getMaster();
+
+    TestEventListenerConfigProvider.disable();
+
+    PushOneCommit.Result res1 = createChange();
+    SourceChangeEventKey sccKey1 = toSccKey(res1);
+    merge(res1);
+
+    TestEventListenerConfigProvider.enable();
+
+    PushOneCommit.Result res2 = createChange();
+    SourceChangeEventKey sccKey2 = toSccKey(res2);
+
+    EiffelEvent sccEvent1 = publisher.getPublished(sccKey1);
+    assertNotNull("Publisher did not find SCC event1", sccEvent1);
+    assertSccLinks(Lists.newArrayList(masterSccEventId), sccEvent1.links);
+
+    EiffelEvent sccEvent2 = publisher.getPublished(sccKey2);
+    assertNotNull("Publisher did not find SCC event2", sccEvent2);
+    assertSccLinks(Lists.newArrayList(sccEvent1.meta.id), sccEvent2.links);
+
+    merge(res2);
+
+    EiffelEvent masterScsEvent =
+        publisher.getPublished(
+            SourceChangeEventKey.scsKey(project.get(), "master", previousMaster));
+    assertNotNull("Publisher did not find SCS event for master", masterScsEvent);
+
+    EventKey scsKey1 = sccKey1.copy(SCS);
+    EiffelEvent scsEvent1 = publisher.getPublished(scsKey1);
+    assertNotNull("Publisher did not find SCS event", scsEvent1);
+    assertEquals(EventKey.fromEvent(scsEvent1), scsKey1);
+    assertScsLinks(Lists.newArrayList(masterScsEvent.meta.id), sccEvent1.meta.id, scsEvent1.links);
+
+    EventKey scsKey2 = sccKey2.copy(SCS);
+    EiffelEvent scsEvent2 = publisher.getPublished(scsKey2);
+    assertNotNull("Publisher did not find SCS event", scsEvent2);
+    assertEquals(EventKey.fromEvent(scsEvent2), scsKey2);
+    assertScsLinks(Lists.newArrayList(scsEvent1.meta.id), sccEvent2.meta.id, scsEvent2.links);
+  }
+
+  @Test
   public void patchSetSubmittedForMetaDoesntResultsInEvent() throws Exception {
     PushOneCommit.Result res = createMetaConfigChange();
     SourceChangeEventKey sccKey = toSccKey(res);
@@ -219,12 +263,18 @@
   }
 
   private UUID markMasterAsHandled(EiffelEventType as) throws Exception {
-    git().fetch().setRefSpecs(new RefSpec(RefNames.REFS_HEADS + "master:FETCH_HEAD")).call();
-    RevCommit originMaster = getHead(repo(), "FETCH_HEAD");
+    RevCommit originMaster = getMaster();
     SourceChangeEventKey scc = SourceChangeEventKey.sccKey(project.get(), "master", originMaster);
     return markAsHandled(as.equals(SCS) ? scc.copy(SCS) : scc, originMaster);
   }
 
+  private RevCommit getMaster()
+      throws GitAPIException, InvalidRemoteException, TransportException, Exception {
+    git().fetch().setRefSpecs(new RefSpec(RefNames.REFS_HEADS + "master:FETCH_HEAD")).call();
+    RevCommit originMaster = getHead(repo(), "FETCH_HEAD");
+    return originMaster;
+  }
+
   public static class TestEventListenerConfigProvider implements Provider<EventListenersConfig> {
     private static boolean enabled;
     private static String[] refPatterns;
@@ -251,6 +301,10 @@
       enabled = false;
     }
 
+    static void enable() {
+      enabled = true;
+    }
+
     @Override
     public EventListenersConfig get() {
       return new EventListenersConfig(