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() 69