diff options
| author | 2023-04-28 01:36:44 +0800 | |
|---|---|---|
| committer | 2023-04-28 01:36:44 +0800 | |
| commit | dd84b9d64fb98746a230cd24233ff50a562c39c9 (patch) | |
| tree | b583261ef00b3afe72ec4d6dacb31e57779a6faf /cli/internal/run/graph_run.go | |
| parent | 0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff) | |
| download | HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip | |
Diffstat (limited to 'cli/internal/run/graph_run.go')
| -rw-r--r-- | cli/internal/run/graph_run.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/cli/internal/run/graph_run.go b/cli/internal/run/graph_run.go new file mode 100644 index 0000000..8531718 --- /dev/null +++ b/cli/internal/run/graph_run.go @@ -0,0 +1,46 @@ +package run + +import ( + gocontext "context" + + "github.com/pyr-sh/dag" + "github.com/vercel/turbo/cli/internal/cmdutil" + "github.com/vercel/turbo/cli/internal/core" + "github.com/vercel/turbo/cli/internal/graphvisualizer" + "github.com/vercel/turbo/cli/internal/util" +) + +// GraphRun generates a visualization of the task graph rather than executing it. +func GraphRun(ctx gocontext.Context, rs *runSpec, engine *core.Engine, base *cmdutil.CmdBase) error { + graph := engine.TaskGraph + if rs.Opts.runOpts.SinglePackage { + graph = filterSinglePackageGraphForDisplay(engine.TaskGraph) + } + visualizer := graphvisualizer.New(base.RepoRoot, base.UI, graph) + + if rs.Opts.runOpts.GraphDot { + visualizer.RenderDotGraph() + } else { + err := visualizer.GenerateGraphFile(rs.Opts.runOpts.GraphFile) + if err != nil { + return err + } + } + return nil +} + +// filterSinglePackageGraphForDisplay builds an equivalent graph with package names stripped from tasks. +// Given that this should only be used in a single-package context, all of the package names are expected +// to be //. Also, all nodes are always connected to the root node, so we are not concerned with leaving +// behind any unconnected nodes. +func filterSinglePackageGraphForDisplay(originalGraph *dag.AcyclicGraph) *dag.AcyclicGraph { + graph := &dag.AcyclicGraph{} + for _, edge := range originalGraph.Edges() { + src := util.StripPackageName(edge.Source().(string)) + tgt := util.StripPackageName(edge.Target().(string)) + graph.Add(src) + graph.Add(tgt) + graph.Connect(dag.BasicEdge(src, tgt)) + } + return graph +} |
