dia r4334 - trunk/plug-ins/python
- From: hans svn gnome org
- To: svn-commits-list gnome org
- Subject: dia r4334 - trunk/plug-ins/python
- Date: Tue, 24 Mar 2009 19:30:25 +0000 (UTC)
Author: hans
Date: Tue Mar 24 19:30:25 2009
New Revision: 4334
URL: http://svn.gnome.org/viewvc/dia?rev=4334&view=rev
Log:
wdeps.py : 2006-05-15 - added the ability to --reduce unwanted symbols, also some output beautifying
Modified:
trunk/plug-ins/python/wdeps.py
Modified: trunk/plug-ins/python/wdeps.py
==============================================================================
--- trunk/plug-ins/python/wdeps.py (original)
+++ trunk/plug-ins/python/wdeps.py Tue Mar 24 19:30:25 2009
@@ -61,6 +61,7 @@
global g_maxWeight
self.name = name # the target
self.weight = len(symbols)
+ self.reduce = 0 # != 0 if this should better vanish
if self.weight > g_maxWeight :
g_maxWeight = self.weight
demangled = []
@@ -112,7 +113,7 @@
# print name
else :
# import by name
- # The system dlls seem to follow a diferent pattern (or is this for know-dlls?) thus (?:[0123456789ABCDEF]{8}[ ]+)?
+ # The system dlls seem to follow a diferent pattern (or is this for know-dlls? Delay load?) thus (?:[0123456789ABCDEF]{8}[ ]+)?
r2 = re.match ("^[ ]+(?:[0123456789ABCDEF]{8}[ ]+)?[0123456789ABCDEF]{1,5}[ ]+([\w ?$]+)$", s)
if not r2 :
r2 = re.match ("^[ ]+(?:[0123456789ABCDEF]{8}[ ]+)?Ordinal[ ]+([1234567890]+)$", s)
@@ -137,6 +138,58 @@
node = deps[sn]
if node.deps.has_key (s) :
del node.deps[s]
+def Reduce (deps, f, bHintOnly = 1) :
+ "Automatically remove connections until there is only something reasonable left"
+ # first iteration: two components are connected in both directions
+ # if one connection is much weaker tahn the other one, the weaker one is considered bad
+ # if both have similar weight they are both treated as bad and removed
+ keys = deps.keys()
+ keys.sort()
+ nReduced = 0
+ for k in keys :
+ node = deps[k]
+ for c in node.deps.keys () :
+ edge = node.deps[c]
+ if deps.has_key (c) :
+ node2 = deps[c]
+ if node2.deps.has_key(k) :
+ edge2 = node2.deps[k]
+ # if one already is reduced dont do it again
+ if edge.reduce or edge2.reduce :
+ continue
+ n = len(edge.symbols)
+ n2 = len(edge2.symbols)
+ if abs(n - n2) < 3 :
+ f.write ("Remove (" + str(n) + "," + str(n2) + ") " + edge.name + " <-> " + edge2.name +
+ "\n\t" + string.join (edge.symbols, ", ") +
+ "\n\t" + string.join (edge2.symbols, ", ") + "\n")
+ # if we now remove *both* connections some components could become completely disconnected.
+ # Instead may try some more guessing. Maybe the component with less deps should drop one more ?
+ if bHintOnly :
+ edge.reduce = 1
+ edge2.reduce = 1
+ else :
+ if node.deps.has_key(c) : del node.deps[c]
+ if node2.deps.has_key(k) : del node2.deps[k]
+ nReduced += (n + n2)
+ elif n > n2 :
+ f.write ("Remove (" + str(n2) + ") " + edge.name + " -> " + edge2.name +
+ "\n\t" + string.join (edge2.symbols, ", ") + "\n")
+ if bHintOnly :
+ edge2.reduce = 1
+ else :
+ if node2.deps.has_key(k) : del node2.deps[k]
+ nReduced += n2
+ else :
+ f.write("Remove (" + str(n) + ") " + edge2.name + " -> " + edge.name +
+ "\n\t" + string.join (edge.symbols, ", ") + "\n")
+ if bHintOnly :
+ edge.reduce = 1
+ else :
+ if node.deps.has_key(c) : del node.deps[c]
+ nReduced += n
+ f.write("Remove total: %d\n" % (nReduced))
+
def Sorted (dict) :
"given a dictionary with name to number, sort by number"
ret = []
@@ -173,6 +226,7 @@
bHaveComponents = 0
bDump = 0
bByUse = 0
+ bReduce = 0
sOutFilename = None
nSymbols = 0
@@ -199,6 +253,8 @@
if nSymbols < 0 : nSymbols = 0
elif arg == "--dump" :
bDump = 1
+ elif arg == "--reduce" :
+ bReduce = 1
elif arg == "--by-use" :
bByUse = 1
elif string.find (arg, "--") == 0 :
@@ -264,8 +320,17 @@
GetDeps (s, deps, nMaxDepth)
Remove (deps, dllsToRemove)
+
+ if bReduce :
+ if not sOutFilename :
+ f2 = f
+ else :
+ f2 = open (sOutFilename + ".reduced", "w")
+ Reduce (deps, f2)
if bDump :
+ # remember the command line
+ f.write ("# " + string.join (sys.argv, " ") + "\n")
Symbols = {}
Modules = {}
Imports = {}
@@ -273,15 +338,18 @@
node = deps[sn]
if len(node.deps.keys()) == 0 :
continue
- print sn
+ f.write (sn + "\n")
Imports[sn] = 0
for se in node.deps.keys() :
edge = node.deps[se]
- print "\t", node.name, "->", edge.name
+ if edge.reduce :
+ f.write ("\t!" + node.name + " -> " + edge.name + "\n")
+ continue
+ f.write ("\t" + node.name + " -> " + edge.name + "\n")
syms = edge.symbols
syms.sort()
for sy in syms :
- print "\t\t", sy
+ f.write ("\t\t" + sy + "\n")
if Symbols.has_key(sy) :
Symbols[sy] += 1
else :
@@ -292,16 +360,16 @@
else :
Modules[edge.name] = [node.name]
# symbols used by many modules are good candidates for refactoring
- print "***** Modules with users (symbols) *****"
+ f.write ( "***** Modules with users (symbols) *****\n" )
for s, i in Sorted (Imports) :
if Modules.has_key (s) :
- print s, "(" + str(i) + ") :" , string.join (Modules[s], ",")
+ f.write (s + " (" + str(i) + ") : " + string.join (Modules[s], ",") + "\n")
else :
- print s, "(0) : <no users>"
+ f.write (s + " (0) : <no users>\n")
# no diagram at all
sys.exit(0)
f.write ('digraph "' + components[0] + '" {\n')
- f.write ('graph [fontsize=24.0 label="wdeps.py ' + string.join (sys.argv[1:], " ")
+ f.write ('graph [fontsize=12.0 label="wdeps.py ' + string.join (sys.argv[1:], " ")
+ '\\n' + time.ctime() + '"]\n')
f.write ('ratio=0.7\nnode [fontsize=32.0 ]\n')
if bByUse :
@@ -320,7 +388,9 @@
else :
# first pass mark don't follows
dontFollowsDone = {}
- for sn in deps.keys() :
+ deps_keys = deps.keys()
+ deps_keys.sort()
+ for sn in deps_keys :
node = deps[sn]
for se in node.deps.keys() :
if se in g_DontFollow :
@@ -329,19 +399,22 @@
f.write ('"%s" [style=filled,color=lightgray]\n' % (se,))
dontFollowsDone[se] = 1
- for sn in deps.keys() :
+ for sn in deps_keys :
# write weighted edges, could also classify the nodes ...
node = deps[sn]
for se in node.deps.keys() :
edge = node.deps[se]
+ sPrefix = ""
+ if edge.reduce : # remove from graph by commenting it out
+ sPrefix = "// " + string.join(edge.symbols, ", ") + "\n// "
if edge.weight <= nSymbols :
#f.write ('"%s" -> "%s" [weight=%f,label=%s]\n' % (node.name, edge.name, math.log(1)-0.5, edge.symbols[0]))
- f.write ('"%s" -> "%s" [fontsize=8,label="%s",weight=%f]\n'
- % (node.name, edge.name, string.join(edge.symbols, "\\n"), math.log10(edge.weight)))
+ f.write ('%s"%s" -> "%s" [fontsize=8,label="%s",weight=%f]\n'
+ % (sPrefix, node.name, edge.name, string.join(edge.symbols, "\\n"), math.log10(edge.weight)))
else :
#f.write ('"%s" -> "%s" [weight=%f]\n' % (node.name, edge.name, math.log(edge.weight)-0.5))
- f.write ('"%s" -> "%s" [label="(%d)",weight=%f]\n'
- % (node.name, edge.name, edge.weight, math.log10(edge.weight)))
+ f.write ('%s"%s" -> "%s" [label="(%d)",weight=%f]\n'
+ % (sPrefix, node.name, edge.name, edge.weight, math.log10(edge.weight)))
f.write("}\n")
if __name__ == '__main__': main()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]