From 8366cf087311982d1c4deb9933b95a51cb1609fb Mon Sep 17 00:00:00 2001 From: James Shubin Date: Sat, 25 Feb 2023 23:16:35 -0500 Subject: [PATCH] pgraph: Add a named error for detected cycles This makes it useful to find when a topological sort failed. --- pgraph/pgraph.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pgraph/pgraph.go b/pgraph/pgraph.go index 73792e6a..2b7f43a1 100644 --- a/pgraph/pgraph.go +++ b/pgraph/pgraph.go @@ -19,6 +19,7 @@ package pgraph import ( + "errors" "fmt" "sort" "strings" @@ -26,6 +27,9 @@ import ( "github.com/purpleidea/mgmt/util/errwrap" ) +// ErrNotAcyclic specifies that a particular graph was not found to be a dag. +var ErrNotAcyclic = errors.New("not a dag!") + // Graph is the graph structure in this library. The graph abstract data type // (ADT) is defined as follows: // * The directed graph arrows point from left to right. ( -> ) @@ -599,7 +603,7 @@ func (g *Graph) TopologicalSort() ([]Vertex, error) { // kahn's algorithm if in > 0 { for n := range g.adjacency[c] { if remaining[n] > 0 { - return nil, fmt.Errorf("not a dag") + return nil, ErrNotAcyclic } } } @@ -622,7 +626,7 @@ func (g *Graph) Reachability(a, b Vertex) ([]Vertex, error) { return nil, fmt.Errorf("empty vertex") } if _, err := g.TopologicalSort(); err != nil { - return nil, err // not a dag? + return nil, err // not a dag! } vertices := g.OutgoingGraphVertices(a) // what points away from a ?