annotate Tools/scripts/pdeps.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 73758db2f464
children 14a27acc755a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4573
73758db2f464 /usr/local/bin/python -> /usr/bin/env python
Guido van Rossum <guido@python.org>
parents: 1105
diff changeset
1 #! /usr/bin/env python
274
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # pdeps
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # Find dependencies between a bunch of Python modules.
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # Usage:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # pdeps file1.py file2.py ...
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # Output:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # Four tables separated by lines like '--- Closure ---':
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # 1) Direct dependencies, listing which module imports which other modules
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # 2) The inverse of (1)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 # 3) Indirect dependencies, or the closure of the above
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # 4) The inverse of (3)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # To do:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 # - command line options to select output type
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # - option to automatically scan the Python library for referenced modules
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 # - option to limit output to particular modules
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 import sys
1105
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
24 import regex
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
25 import os
274
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 import string
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 # Main program
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 def main():
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 args = sys.argv[1:]
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 if not args:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 print 'usage: pdeps file.py file.py ...'
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 return 2
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 table = {}
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 for arg in args:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 process(arg, table)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 print '--- Uses ---'
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 printresults(table)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 print '--- Used By ---'
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 inv = inverse(table)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 printresults(inv)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 print '--- Closure of Uses ---'
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 reach = closure(table)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 printresults(reach)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 print '--- Closure of Used By ---'
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 invreach = inverse(reach)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 printresults(invreach)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 return 0
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 # Compiled regular expressions to search for import statements
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 #
1105
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
61 m_import = regex.compile('^[ \t]*from[ \t]+\([^ \t]+\)[ \t]+')
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
62 m_from = regex.compile('^[ \t]*import[ \t]+\([^#]+\)')
274
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 # Collect data from one file
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 def process(filename, table):
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 fp = open(filename, 'r')
1105
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
69 mod = os.path.basename(filename)
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 274
diff changeset
70 if mod[-3:] == '.py':
274
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 mod = mod[:-3]
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 table[mod] = list = []
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 while 1:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 line = fp.readline()
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 if not line: break
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 274
diff changeset
76 while line[-1:] == '\\':
274
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 nextline = fp.readline()
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 if not nextline: break
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 line = line[:-1] + nextline
1105
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
80 if m_import.match(line) >= 0:
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
81 (a, b), (a1, b1) = m_import.regs[:2]
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
82 elif m_from.match(line) >= 0:
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
83 (a, b), (a1, b1) = m_from.regs[:2]
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
84 else: continue
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
85 words = string.splitfields(line[a1:b1], ',')
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
86 # print '#', line, words
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
87 for word in words:
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
88 word = string.strip(word)
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
89 if word not in list:
6f2a6efd019e Adapt to modern times...
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
90 list.append(word)
274
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 # Compute closure (this is in fact totally general)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 def closure(table):
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 modules = table.keys()
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 # Initialize reach with a copy of table
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 reach = {}
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 for mod in modules:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 reach[mod] = table[mod][:]
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 # Iterate until no more change
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 change = 1
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 while change:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 change = 0
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 for mod in modules:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 for mo in reach[mod]:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 if mo in modules:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 for m in reach[mo]:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 if m not in reach[mod]:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 reach[mod].append(m)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 change = 1
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 return reach
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 # Invert a table (this is again totally general).
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 # All keys of the original table are made keys of the inverse,
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 # so there may be empty lists in the inverse.
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 def inverse(table):
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 inv = {}
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 for key in table.keys():
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 if not inv.has_key(key):
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 inv[key] = []
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 for item in table[key]:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 store(inv, item, key)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 return inv
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 # Store "item" in "dict" under "key".
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 # The dictionary maps keys to lists of items.
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 # If there is no list for the key yet, it is created.
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 def store(dict, key, item):
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 if dict.has_key(key):
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 dict[key].append(item)
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 else:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 dict[key] = [item]
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 # Tabulate results neatly
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 #
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 def printresults(table):
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 modules = table.keys()
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 maxlen = 0
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 for mod in modules: maxlen = max(maxlen, len(mod))
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 modules.sort()
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 for mod in modules:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 list = table[mod]
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 list.sort()
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 print string.ljust(mod, maxlen), ':',
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 if mod in list:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 print '(*)',
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 for ref in list:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 print ref,
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 print
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 # Call main and honor exit status
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 try:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 sys.exit(main())
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 except KeyboardInterrupt:
12a64115a4ee Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 sys.exit(1)