aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cli/internal/run/graph_run.go
diff options
context:
space:
mode:
author简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
committer简律纯 <hsiangnianian@outlook.com>2023-04-28 01:36:44 +0800
commitdd84b9d64fb98746a230cd24233ff50a562c39c9 (patch)
treeb583261ef00b3afe72ec4d6dacb31e57779a6faf /cli/internal/run/graph_run.go
parent0b46fcd72ac34382387b2bcf9095233efbcc52f4 (diff)
downloadHydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.tar.gz
HydroRoll-dd84b9d64fb98746a230cd24233ff50a562c39c9.zip
Diffstat (limited to 'cli/internal/run/graph_run.go')
-rw-r--r--cli/internal/run/graph_run.go46
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
+}