aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Warta <[email protected]>2015-07-29 10:15:00 +0200
committerSimon Warta <[email protected]>2015-07-29 10:15:00 +0200
commita22ae26ce0bdfe32f6e9076ca3a2e1a0a763b0a4 (patch)
tree6600a429695454e52c571baf82a5b81df96dd5eb
parent4aa3efdf15c9d9746d31e6e57d5137152f5fd29f (diff)
Fix bugs in show_dependencies; Add option to show all dependencies
-rwxr-xr-xsrc/scripts/show_dependencies.py62
1 files changed, 50 insertions, 12 deletions
diff --git a/src/scripts/show_dependencies.py b/src/scripts/show_dependencies.py
index 37cb817d0..937626a86 100755
--- a/src/scripts/show_dependencies.py
+++ b/src/scripts/show_dependencies.py
@@ -13,6 +13,7 @@ Botan is released under the Simplified BSD License (see license.txt)
# global
import argparse
+import copy
import sys
import subprocess
from collections import OrderedDict
@@ -44,6 +45,9 @@ parser.add_argument('--engine',
choices=["fdp", "dot"],
default="fdp",
help='The graph engine (drawing mode only)')
+parser.add_argument('--all', dest='all', action='store_const',
+ const=True, default=False,
+ help='Show all dependencies. Default: direct dependencies only. (list mode only)')
parser.add_argument('--verbose', dest='verbose', action='store_const',
const=True, default=False,
help='Verbose output (default: false)')
@@ -96,35 +100,65 @@ if args.verbose:
if args.verbose:
print("resolving dependencies ...")
+def cartinality(depdict):
+ return sum([len(depdict[k]) for k in depdict])
+
+registered_dependencies = dict()
all_dependencies = dict()
direct_dependencies = dict()
for module in modules:
lst = module.dependencies()
- direct_dependencies[module.basename] = set(lst)
+ registered_dependencies[module.basename] = set(lst) - set([module.basename])
+
+# Get all_dependencies from registered_dependencies
+def add_dependency():
+ for key in all_dependencies:
+ potentially_new_modules_for_key = None
+ new_modules_for_key = None
+ for currently_in in all_dependencies[key]:
+ if currently_in in all_dependencies:
+ potentially_new_modules_for_key = all_dependencies[currently_in] - set([key])
+ if not potentially_new_modules_for_key <= all_dependencies[key]:
+ new_modules_for_key = potentially_new_modules_for_key.copy()
+ break
+ if new_modules_for_key:
+ all_dependencies[key] |= new_modules_for_key
+ return
+
+
+all_dependencies = copy.deepcopy(registered_dependencies)
+direct_dependencies = copy.deepcopy(registered_dependencies)
-all_dependencies = direct_dependencies.copy()
+# Sort
+all_dependencies = OrderedDict(sorted(all_dependencies.items()))
+direct_dependencies = OrderedDict(sorted(direct_dependencies.items()))
#print(direct_dependencies)
-def cartinality(depdict):
- return sum([len(depdict[k]) for k in depdict])
-
-# Sort
-direct_dependencies = OrderedDict(sorted(direct_dependencies.items()))
+last_card = -1
+while True:
+ card = cartinality(all_dependencies)
+ # print(card)
+ if card == last_card:
+ break;
+ last_card = card
+ add_dependency()
+# Return true iff a depends on b,
+# i.e. b is in the dependencies of a
def depends_on(a, b):
- if not a in all_dependencies:
+ if not a in direct_dependencies:
return False
else:
- return b in all_dependencies[a]
+ return b in direct_dependencies[a]
def remove_indirect_dependencies():
for mod in direct_dependencies:
for one in direct_dependencies[mod]:
others = direct_dependencies[mod] - set([one])
for other in others:
- if depends_on(one, other):
+ if depends_on(other, one):
direct_dependencies[mod].remove(one)
return
# Go to next mod
@@ -148,8 +182,12 @@ if args.verbose:
print("Done resolving dependencies.")
if args.mode == "list":
- for key in direct_dependencies:
- print(key.ljust(17) + " : " + ", ".join(sorted(direct_dependencies[key])))
+ if args.all:
+ for key in all_dependencies:
+ print(key.ljust(17) + " : " + ", ".join(sorted(all_dependencies[key])))
+ else:
+ for key in direct_dependencies:
+ print(key.ljust(17) + " : " + ", ".join(sorted(direct_dependencies[key])))
if args.mode == "draw":
import graphviz as gv