summaryrefslogtreecommitdiffstats
path: root/tools/filter-product-graph.py
diff options
context:
space:
mode:
authorJoe Onorato <joeo@google.com>2012-05-07 17:15:15 -0700
committerJoe Onorato <joeo@google.com>2012-08-16 22:45:55 -0700
commit8b46e302e6ed30e72ece1680767d00fc4241f2d5 (patch)
tree5556a1003fa95c42b6f198d9f3c9bbe3edac7063 /tools/filter-product-graph.py
parent9e253b06d218f29dde8ac6087c39a826d8b30d6e (diff)
downloadbuild-8b46e302e6ed30e72ece1680767d00fc4241f2d5.zip
build-8b46e302e6ed30e72ece1680767d00fc4241f2d5.tar.gz
build-8b46e302e6ed30e72ece1680767d00fc4241f2d5.tar.bz2
make product-graph now filtered
Change-Id: I6bd93a87902e20a24c1c58152fb578ef1f4cb208
Diffstat (limited to 'tools/filter-product-graph.py')
-rwxr-xr-xtools/filter-product-graph.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/tools/filter-product-graph.py b/tools/filter-product-graph.py
new file mode 100755
index 0000000..b3a5b42
--- /dev/null
+++ b/tools/filter-product-graph.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+# vim: ts=2 sw=2 nocindent
+
+import re
+import sys
+
+def choose_regex(regs, line):
+ for func,reg in regs:
+ m = reg.match(line)
+ if m:
+ return (func,m)
+ return (None,None)
+
+def gather(included, deps):
+ result = set()
+ for inc in included:
+ result.add(inc)
+ for d in deps:
+ if inc == d[1]:
+ result.add(d[0])
+ return result
+
+def main():
+ deps = []
+ infos = []
+ def dependency(m):
+ deps.append((m.group(1), m.group(2)))
+ def info(m):
+ infos.append((m.group(1), m.group(2)))
+
+ REGS = [
+ (dependency, re.compile(r'"(.*)"\s*->\s*"(.*)"')),
+ (info, re.compile(r'"(.*)"(\s*\[.*\])')),
+ ]
+
+ lines = sys.stdin.readlines()
+ lines = [line.strip() for line in lines]
+
+ for line in lines:
+ func,m = choose_regex(REGS, line)
+ if func:
+ func(m)
+
+ # filter
+ sys.stderr.write("argv: " + str(sys.argv) + "\n")
+ if not (len(sys.argv) == 2 and sys.argv[1] == "--all"):
+ targets = sys.argv[1:]
+
+ included = set(targets)
+ prevLen = -1
+ while prevLen != len(included):
+ prevLen = len(included)
+ included = gather(included, deps)
+
+ deps = [dep for dep in deps if dep[1] in included]
+ infos = [info for info in infos if info[0] in included]
+
+ print "digraph {"
+ print "graph [ ratio=.5 ];"
+ for dep in deps:
+ print '"%s" -> "%s"' % dep
+ for info in infos:
+ print '"%s"%s' % info
+ print "}"
+
+
+if __name__ == "__main__":
+ main()