in workflow.go [120:153]
func (w *Workflow) setUpstream(step, up Steper) {
if step == nil || up == nil {
return
}
w.addStep(up, nil) // just add the upstream step
var stepWalked, upWalked []Steper
Traverse(w, func(s Steper, walked []Steper) TraverseDecision {
if s == step {
stepWalked = walked
}
if s == up {
upWalked = walked
}
if len(stepWalked) > 0 && len(upWalked) > 0 {
return TraverseStop
}
return TraverseContinue
})
i := 0
for ; i < len(stepWalked) && i < len(upWalked); i++ {
if stepWalked[i] != upWalked[i] {
break
}
}
i--
for ; i >= 0; i-- {
if s, ok := stepWalked[i].(interface {
StateOf(Steper) *State
RootOf(Steper) Steper
}); ok {
s.StateOf(s.RootOf(step)).AddUpstream(up)
}
}
}