@@ -127,20 +127,21 @@ public static List<CIEventCause> processCauses(Run<?, ?> run) {
127127
128128 public static List <CIEventCause > processCauses (FlowNode flowNode ) {
129129 List <CIEventCause > causes = new LinkedList <>();
130- processCauses (flowNode , causes , new LinkedHashSet <>());
130+ processCauses (flowNode , causes , new LinkedHashSet <>(), new HashSet <>() );
131131 return causes ;
132132 }
133133
134- private static void processCauses (FlowNode flowNode , List <CIEventCause > causes , Set <FlowNode > startStagesToSkip ) {
134+ private static void processCauses (FlowNode flowNode , List <CIEventCause > causes , Set <FlowNode > startStagesToSkip , Set < FlowNode > visitedParents ) {
135135 // we reached the start of the flow - add WorkflowRun as an initial UPSTREAM cause
136- if (flowNode .getParents ().isEmpty ()) {
136+ if (flowNode .getParents ().isEmpty () && ! visitedParents . contains ( flowNode ) ) {
137137 WorkflowRun parentRun = BuildHandlerUtils .extractParentRun (flowNode );
138138 CIEventCause cause = dtoFactory .newDTO (CIEventCause .class )
139139 .setType (CIEventCauseType .UPSTREAM )
140140 .setProject (BuildHandlerUtils .getJobCiId (parentRun ))
141141 .setBuildCiId (BuildHandlerUtils .getBuildCiId (parentRun ))
142142 .setCauses (CIEventCausesFactory .processCauses ((parentRun )));
143- causes .add (cause );
143+ visitedParents .add (flowNode );
144+ causes .add (cause );
144145 }
145146
146147 // if we are calculating causes for the END STEP - exclude it's own START STEP from calculation
@@ -151,21 +152,24 @@ private static void processCauses(FlowNode flowNode, List<CIEventCause> causes,
151152 for (FlowNode parent : flowNode .getParents ()) {
152153 if (BuildHandlerUtils .isStageEndNode (parent )) {
153154 startStagesToSkip .add (((StepEndNode ) parent ).getStartNode ());
154- processCauses (parent , causes , startStagesToSkip );
155+ processCauses (parent , causes , startStagesToSkip , visitedParents );
155156 } else if (BuildHandlerUtils .isStageStartNode (parent )) {
156157 if (!startStagesToSkip .contains (parent )) {
157- CIEventCause cause = dtoFactory .newDTO (CIEventCause .class )
158- .setType (CIEventCauseType .UPSTREAM )
159- .setProject (parent .getDisplayName ())
160- .setBuildCiId (String .valueOf (BuildHandlerUtils .extractParentRun (parent ).getNumber ()));
161- causes .add (cause );
162- processCauses (parent , cause .getCauses (), startStagesToSkip );
158+ if (!visitedParents .contains (parent )) {
159+ visitedParents .add (parent );
160+ CIEventCause cause = dtoFactory .newDTO (CIEventCause .class )
161+ .setType (CIEventCauseType .UPSTREAM )
162+ .setProject (parent .getDisplayName ())
163+ .setBuildCiId (String .valueOf (BuildHandlerUtils .extractParentRun (parent ).getNumber ()));
164+ causes .add (cause );
165+ processCauses (parent , cause .getCauses (), startStagesToSkip , visitedParents );
166+ }
163167 } else {
164168 startStagesToSkip .remove (parent );
165- processCauses (parent , causes , startStagesToSkip );
169+ processCauses (parent , causes , startStagesToSkip , visitedParents );
166170 }
167171 } else {
168- processCauses (parent , causes , startStagesToSkip );
172+ processCauses (parent , causes , startStagesToSkip , visitedParents );
169173 }
170174 }
171175 }
0 commit comments