Joe Onorato | 8b46e30 | 2012-05-07 17:15:15 -0700 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # vim: ts=2 sw=2 nocindent |
| 3 | |
| 4 | import re |
| 5 | import sys |
| 6 | |
| 7 | def choose_regex(regs, line): |
| 8 | for func,reg in regs: |
| 9 | m = reg.match(line) |
| 10 | if m: |
| 11 | return (func,m) |
| 12 | return (None,None) |
| 13 | |
| 14 | def gather(included, deps): |
| 15 | result = set() |
| 16 | for inc in included: |
| 17 | result.add(inc) |
| 18 | for d in deps: |
| 19 | if inc == d[1]: |
| 20 | result.add(d[0]) |
| 21 | return result |
| 22 | |
| 23 | def main(): |
| 24 | deps = [] |
| 25 | infos = [] |
| 26 | def dependency(m): |
| 27 | deps.append((m.group(1), m.group(2))) |
| 28 | def info(m): |
| 29 | infos.append((m.group(1), m.group(2))) |
| 30 | |
| 31 | REGS = [ |
| 32 | (dependency, re.compile(r'"(.*)"\s*->\s*"(.*)"')), |
| 33 | (info, re.compile(r'"(.*)"(\s*\[.*\])')), |
| 34 | ] |
| 35 | |
| 36 | lines = sys.stdin.readlines() |
| 37 | lines = [line.strip() for line in lines] |
| 38 | |
| 39 | for line in lines: |
| 40 | func,m = choose_regex(REGS, line) |
| 41 | if func: |
| 42 | func(m) |
| 43 | |
| 44 | # filter |
| 45 | sys.stderr.write("argv: " + str(sys.argv) + "\n") |
| 46 | if not (len(sys.argv) == 2 and sys.argv[1] == "--all"): |
| 47 | targets = sys.argv[1:] |
| 48 | |
| 49 | included = set(targets) |
| 50 | prevLen = -1 |
| 51 | while prevLen != len(included): |
| 52 | prevLen = len(included) |
| 53 | included = gather(included, deps) |
| 54 | |
| 55 | deps = [dep for dep in deps if dep[1] in included] |
| 56 | infos = [info for info in infos if info[0] in included] |
| 57 | |
| 58 | print "digraph {" |
| 59 | print "graph [ ratio=.5 ];" |
| 60 | for dep in deps: |
| 61 | print '"%s" -> "%s"' % dep |
| 62 | for info in infos: |
| 63 | print '"%s"%s' % info |
| 64 | print "}" |
| 65 | |
| 66 | |
| 67 | if __name__ == "__main__": |
| 68 | main() |