From 6dd68afdc9f65d7e420b19f69b3d6f4bb27f67bc Mon Sep 17 00:00:00 2001 From: Niraj-Fonseka Date: Fri, 10 Dec 2021 00:55:10 -0600 Subject: [PATCH 1/2] updating readme --- README.md | 11 ++++++ cmd/depth/depth.go | 93 ++++++++++++++++++++++++++++++++++++++++++++- graph.png | Bin 0 -> 60290 bytes 3 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 graph.png diff --git a/README.md b/README.md index 0de954f..b678169 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,17 @@ $ depth -json github.com/KyleBanks/depth/cmd/depth } ``` +#### `-graph` + +The `-graph` flag instructs `depth` to render the dependencies into a png file using graphviz + +```sh +$ depth -graph github.com/KyleBanks/depth/cmd/depth +``` + +![graph.png](graph.png) + + ### Integrating With Your Project The `depth` package can easily be used to retrieve the dependency tree for a particular package in your own project. For example, here's how you would retrieve the dependency tree for the `strings` package: diff --git a/cmd/depth/depth.go b/cmd/depth/depth.go index a924a60..fb05243 100644 --- a/cmd/depth/depth.go +++ b/cmd/depth/depth.go @@ -6,7 +6,10 @@ import ( "fmt" "io" "os" + "log" + "bytes" "strings" + "github.com/goccy/go-graphviz" "github.com/KyleBanks/depth" ) @@ -20,6 +23,7 @@ const ( var outputJSON bool var explainPkg string +var outputGraph bool type summary struct { numInternal int @@ -29,7 +33,7 @@ type summary struct { func main() { t, pkgs := parse(os.Args[1:]) - if err := handlePkgs(t, pkgs, outputJSON, explainPkg); err != nil { + if err := handlePkgs(t, pkgs, outputJSON, explainPkg,outputGraph); err != nil { os.Exit(1) } } @@ -45,6 +49,7 @@ func parse(args []string) (*depth.Tree, []string) { f.IntVar(&t.MaxDepth, "max", 0, "Sets the maximum depth of dependencies to resolve.") f.BoolVar(&outputJSON, "json", false, "If set, outputs the depencies in JSON format.") f.StringVar(&explainPkg, "explain", "", "If set, show which packages import the specified target") + f.BoolVar(&outputGraph, "graph", false, "If set, renders the dependencies in a graph and outputs as a png file") f.Parse(args) return &t, f.Args() @@ -52,7 +57,7 @@ func parse(args []string) (*depth.Tree, []string) { // handlePkgs takes a slice of package names, resolves a Tree on them, // and outputs each Tree to Stdout. -func handlePkgs(t *depth.Tree, pkgs []string, outputJSON bool, explainPkg string) error { +func handlePkgs(t *depth.Tree, pkgs []string, outputJSON bool, explainPkg string, outputGraph bool) error { for _, pkg := range pkgs { err := t.Resolve(pkg) @@ -71,6 +76,11 @@ func handlePkgs(t *depth.Tree, pkgs []string, outputJSON bool, explainPkg string continue } + if outputGraph { + generateGraph(*t.Root) + continue + } + writePkg(os.Stdout, *t.Root) writePkgSummary(os.Stdout, *t.Root) } @@ -161,3 +171,82 @@ func writeExplain(w io.Writer, pkg depth.Pkg, stack []string, explain string) { writeExplain(w, p, stack, explain) } } + +// generateGraph creates a node graph and renders it as a file +func generateGraph(pkg depth.Pkg) { + + //adjacency list +adjlist := make(map[string][]string) +for _, p := range pkg.Deps { + + _, parentok := adjlist[p.Parent.Name] + if !parentok { + adjlist[p.Parent.Name] = make([]string, 0) + } + adjlist[p.Parent.Name] = append(adjlist[p.Parent.Name], p.Name) + + _, ok := adjlist[p.Name] + if !ok { + adjlist[p.Name] = make([]string, 0) + } + + + generateGraphRec(p, p.Name, adjlist) +} + +g := graphviz.New() +graph, err := g.Graph() + +defer func() { + if err := graph.Close(); err != nil { + log.Fatal(err) + } + g.Close() +}() + +if err != nil { + log.Fatal(err) +} + +for parent, children := range adjlist { + n, err := graph.CreateNode(parent) + if err != nil { + log.Fatal(err) + } + + for _, child := range children { + c, err := graph.CreateNode(child) + if err != nil { + log.Fatal(err) + } + + _, err = graph.CreateEdge("", n, c) + if err != nil { + log.Fatal(err) + } + + } +} + +var buf bytes.Buffer +if err := g.Render(graph, "dot", &buf); err != nil { + log.Fatal(err) +} + +if err := g.RenderFilename(graph, graphviz.PNG, "graph.png"); err != nil { + log.Fatal(err) +} +} + +func generateGraphRec(pkg depth.Pkg, parent string, adjlist map[string][]string) { + +for _, p := range pkg.Deps { + _, ok := adjlist[p.Name] + if !ok { + adjlist[p.Name] = make([]string, 0) + } + + adjlist[parent] = append(adjlist[parent], p.Name) + generateGraphRec(p, p.Name, adjlist) +} +} \ No newline at end of file diff --git a/graph.png b/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..93c9a395c7dccd0bd259706109a9ec25994a909a GIT binary patch literal 60290 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 literal 0 HcmV?d00001 From a4bc4f5be1bc2783e3418c1da641ffe2c221d193 Mon Sep 17 00:00:00 2001 From: Niraj-Fonseka Date: Fri, 10 Dec 2021 09:51:32 -0600 Subject: [PATCH 2/2] go fmt changes --- cmd/depth/depth.go | 109 ++++++++++++++++++++++----------------------- 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/cmd/depth/depth.go b/cmd/depth/depth.go index fb05243..b5d358e 100644 --- a/cmd/depth/depth.go +++ b/cmd/depth/depth.go @@ -1,15 +1,15 @@ package main import ( + "bytes" "encoding/json" "flag" "fmt" + "github.com/goccy/go-graphviz" "io" - "os" "log" - "bytes" + "os" "strings" - "github.com/goccy/go-graphviz" "github.com/KyleBanks/depth" ) @@ -33,7 +33,7 @@ type summary struct { func main() { t, pkgs := parse(os.Args[1:]) - if err := handlePkgs(t, pkgs, outputJSON, explainPkg,outputGraph); err != nil { + if err := handlePkgs(t, pkgs, outputJSON, explainPkg, outputGraph); err != nil { os.Exit(1) } } @@ -174,79 +174,78 @@ func writeExplain(w io.Writer, pkg depth.Pkg, stack []string, explain string) { // generateGraph creates a node graph and renders it as a file func generateGraph(pkg depth.Pkg) { - - //adjacency list -adjlist := make(map[string][]string) -for _, p := range pkg.Deps { - - _, parentok := adjlist[p.Parent.Name] - if !parentok { - adjlist[p.Parent.Name] = make([]string, 0) - } - adjlist[p.Parent.Name] = append(adjlist[p.Parent.Name], p.Name) - - _, ok := adjlist[p.Name] - if !ok { - adjlist[p.Name] = make([]string, 0) - } + //adjacency list + adjlist := make(map[string][]string) + for _, p := range pkg.Deps { - generateGraphRec(p, p.Name, adjlist) -} + _, parentok := adjlist[p.Parent.Name] + if !parentok { + adjlist[p.Parent.Name] = make([]string, 0) + } + adjlist[p.Parent.Name] = append(adjlist[p.Parent.Name], p.Name) -g := graphviz.New() -graph, err := g.Graph() + _, ok := adjlist[p.Name] + if !ok { + adjlist[p.Name] = make([]string, 0) + } -defer func() { - if err := graph.Close(); err != nil { - log.Fatal(err) + generateGraphRec(p, p.Name, adjlist) } - g.Close() -}() -if err != nil { - log.Fatal(err) -} + g := graphviz.New() + graph, err := g.Graph() + + defer func() { + if err := graph.Close(); err != nil { + log.Fatal(err) + } + g.Close() + }() -for parent, children := range adjlist { - n, err := graph.CreateNode(parent) if err != nil { log.Fatal(err) } - for _, child := range children { - c, err := graph.CreateNode(child) + for parent, children := range adjlist { + n, err := graph.CreateNode(parent) if err != nil { log.Fatal(err) } - _, err = graph.CreateEdge("", n, c) - if err != nil { - log.Fatal(err) - } + for _, child := range children { + c, err := graph.CreateNode(child) + if err != nil { + log.Fatal(err) + } + _, err = graph.CreateEdge("", n, c) + if err != nil { + log.Fatal(err) + } + + } } -} -var buf bytes.Buffer -if err := g.Render(graph, "dot", &buf); err != nil { - log.Fatal(err) -} + var buf bytes.Buffer + if err := g.Render(graph, "dot", &buf); err != nil { + log.Fatal(err) + } -if err := g.RenderFilename(graph, graphviz.PNG, "graph.png"); err != nil { - log.Fatal(err) -} + if err := g.RenderFilename(graph, graphviz.PNG, "graph.png"); err != nil { + log.Fatal(err) + } } func generateGraphRec(pkg depth.Pkg, parent string, adjlist map[string][]string) { -for _, p := range pkg.Deps { - _, ok := adjlist[p.Name] - if !ok { - adjlist[p.Name] = make([]string, 0) - } + for _, p := range pkg.Deps { + _, ok := adjlist[p.Name] + if !ok { + adjlist[p.Name] = make([]string, 0) + } - adjlist[parent] = append(adjlist[parent], p.Name) - generateGraphRec(p, p.Name, adjlist) + adjlist[parent] = append(adjlist[parent], p.Name) + generateGraphRec(p, p.Name, adjlist) + } } -} \ No newline at end of file