Add --query flag
diff --git a/query.go b/query.go
new file mode 100644
index 0000000..bbb068d
--- /dev/null
+++ b/query.go
@@ -0,0 +1,65 @@
+package main
+
+import "fmt"
+
+func showDeps(n *DepNode, indent int, seen map[string]int) {
+ id, present := seen[n.Output]
+ if !present {
+ id = len(seen)
+ seen[n.Output] = id
+ }
+ fmt.Printf("%*c%s (%d)\n", indent, ' ', n.Output, id)
+ if present {
+ return
+ }
+ for _, d := range n.Deps {
+ showDeps(d, indent + 1, seen)
+ }
+}
+
+func showNode(n *DepNode) {
+ fmt.Printf("%s:", n.Output)
+ for _, i := range n.ActualInputs {
+ fmt.Printf(" %s", i)
+ }
+ fmt.Printf("\n")
+ for _, c := range n.Cmds {
+ fmt.Printf("\t%s\n", c)
+ }
+ for k, v := range n.TargetSpecificVars {
+ fmt.Printf("%s: %s=%s\n", n.Output, k, v.String())
+ }
+
+ fmt.Printf("\n")
+ fmt.Printf("location: %s:%d\n", n.Filename, n.Lineno)
+ if n.IsOrderOnly {
+ fmt.Printf("order-only: true\n")
+ }
+ if n.IsPhony {
+ fmt.Printf("phony: true\n")
+ }
+
+ seen := make(map[string]int)
+ fmt.Printf("dependencies:\n")
+ showDeps(n, 1, seen)
+}
+
+func HandleNodeQuery(q string, nodes []*DepNode) {
+ for _, n := range nodes {
+ if n.Output == q {
+ showNode(n)
+ break
+ }
+ }
+}
+
+func HandleQuery(q string, nodes []*DepNode, vars Vars) {
+ if q == "*" {
+ for _, n := range nodes {
+ fmt.Printf("%s\n", n.Output)
+ }
+ return
+ }
+ HandleNodeQuery(q, nodes)
+}
+