author | Sverre Rabbelier <srabbelier@gmail.com> |
Wed, 26 Nov 2008 23:56:35 +0000 | |
changeset 595 | 3c4d5b7d4391 |
child 597 | 66088092f849 |
permissions | -rwxr-xr-x |
595
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
2 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
3 |
import sys |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
4 |
sys.path.append('/usr/lib/graphviz/python/') |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
5 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
6 |
import cPickle |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
7 |
import os |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
8 |
import graph |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
9 |
import gv |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
10 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
11 |
def parseFile(file_name): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
12 |
if os.path.exists("imports.dat"): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
13 |
log = open("imports.dat", "r") |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
14 |
all_imports = cPickle.load(log) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
15 |
log.close() |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
16 |
else: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
17 |
all_imports = {} |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
18 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
19 |
if file_name in all_imports: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
20 |
print "Overwriting previous data on '%s'." % file_name |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
21 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
22 |
imports = [] |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
23 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
24 |
file = open(file_name) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
25 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
26 |
for line in file: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
27 |
if line.lstrip().startswith('import soc'): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
28 |
splitline = line[:-1].split(' ') |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
29 |
mod = splitline[1] |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
30 |
imports.append(mod) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
31 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
32 |
if line.lstrip().startswith('from soc'): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
33 |
splitline = line[:-1].split(' ') |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
34 |
mod = splitline[1] + '.' + splitline[3] |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
35 |
imports.append(mod) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
36 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
37 |
for idx, imp in enumerate(imports): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
38 |
if imp in set(imports[idx+1:]): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
39 |
print "Warning: file '%s' has a redundant import: '%s'." % (file_name, imp) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
40 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
41 |
normalized = "soc.%s" % file_name[:-3].replace('/', '.') |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
42 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
43 |
print "Writing imports for file %s (%s)." % (file_name, normalized) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
44 |
all_imports[normalized] = imports |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
45 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
46 |
log = open("imports.dat", "w") |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
47 |
cPickle.dump(all_imports, log) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
48 |
log.close() |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
49 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
50 |
return 0 |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
51 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
52 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
53 |
def buildGraph(): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
54 |
log = open("imports.dat", "r") |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
55 |
all_imports = cPickle.load(log) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
56 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
57 |
gr = graph.graph() |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
58 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
59 |
gr.add_nodes(all_imports.keys()) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
60 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
61 |
for file_name, imports in all_imports.iteritems(): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
62 |
for imp in imports: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
63 |
if imp not in gr: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
64 |
gr.add_node(imp) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
65 |
gr.add_edge(file_name, imp) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
66 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
67 |
return gr |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
68 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
69 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
70 |
def showGraph(): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
71 |
gr = buildGraph() |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
72 |
for node in gr: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
73 |
print "%s: " % node |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
74 |
for edge in gr[node]: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
75 |
print "\t%s" % edge |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
76 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
77 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
78 |
def drawGraph(): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
79 |
gr = buildGraph() |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
80 |
dot = gr.write(fmt='dot') |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
81 |
gvv = gv.readstring(dot) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
82 |
gv.layout(gvv,'dot') |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
83 |
gv.render(gvv,'png','imports.png') |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
84 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
85 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
86 |
def main(args): |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
87 |
if len(args) == 1: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
88 |
if args[0] == '.': |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
89 |
return showGraph() |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
90 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
91 |
if args[0] == '..': |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
92 |
return drawGraph() |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
93 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
94 |
if not args: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
95 |
print "Please specify a filename to parse, or '.' to list the parsed imports" |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
96 |
return -1 |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
97 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
98 |
res = 0 |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
99 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
100 |
for file_name in args: |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
101 |
res += parseFile(file_name) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
102 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
103 |
print "Done parsing." |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
104 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
105 |
return res |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
106 |
|
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
107 |
if __name__ == '__main__': |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
108 |
import sys |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
109 |
res = main(sys.argv[1:]) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
110 |
sys.exit(res) |
3c4d5b7d4391
Added rudementry include checker
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff
changeset
|
111 |