diff --git a/dag/dag.go b/dag/dag.go index c2e88f3..8dc2261 100644 --- a/dag/dag.go +++ b/dag/dag.go @@ -547,7 +547,6 @@ func (g *Graph) getNextVertex() (*Vertex, bool, bool) { return keys[i] < keys[j] }) } - // Logger.Printf("Keys: %v\n", keys) if g.serial { for k := range keys { @@ -556,15 +555,26 @@ func (g *Graph) getNextVertex() (*Vertex, bool, bool) { if vertex.status == runInProgress { return vertex, false, false } - for _, child := range vertex.Children { + childKeys := []ID{} + for k := range vertex.Children { + childKeys = append(childKeys, k) + } + if g.Ordered { + sort.Slice(childKeys, func(i, j int) bool { + return childKeys[i] < childKeys[j] + }) + } + + for _, k := range childKeys { + child := vertex.Children[k] if child.status == runInProgress { return child, false, false } } } } - for k := range keys { - vertex := g.Vertices[keys[k]] + for _, k := range keys { + vertex := g.Vertices[k] if vertex.status != runPending && vertex.status != runSkip { if vertex.status == runDone { doneCount++ @@ -576,13 +586,17 @@ func (g *Graph) getNextVertex() (*Vertex, bool, bool) { } childPending := false - // TODO: - // childKeys := []ID{} - // for k := range vertex.Children { - // keys = append(keys, k) - // } - - for _, child := range vertex.Children { + childKeys := []ID{} + for k := range vertex.Children { + childKeys = append(childKeys, k) + } + if g.Ordered { + sort.Slice(childKeys, func(i, j int) bool { + return childKeys[i] < childKeys[j] + }) + } + for _, k := range childKeys { + child := vertex.Children[k] if child.status == runPending { childPending = true } diff --git a/dag/dag_test.go b/dag/dag_test.go index 0e53a51..84e1be2 100644 --- a/dag/dag_test.go +++ b/dag/dag_test.go @@ -180,7 +180,6 @@ func TestDagSorted(t *testing.T) { results := []int{} generateFn := func(n int) getoptions.CommandFn { return func(ctx context.Context, opt *getoptions.GetOpt, args []string) error { - time.Sleep(30 * time.Millisecond) sm.Lock() results = append(results, n) sm.Unlock() @@ -255,19 +254,19 @@ func TestDagSorted(t *testing.T) { t.Errorf("Wrong list %d: %v\n", 3, results) } case 4: - if e != 1 { + if e != 2 { t.Errorf("Wrong list %d: %v\n", 4, results) } case 5: - if e != 2 { + if e != 3 { t.Errorf("Wrong list %d: %v\n", 5, results) } case 6: - if e != 3 { + if e != 6 { t.Errorf("Wrong list %d: %v\n", 6, results) } case 7: - if e != 6 { + if e != 1 { t.Errorf("Wrong list %d: %v\n", 7, results) } }