#!/usr/bin/python import sys, os, re def stripmod(ppkg): if ppkg[0] == '|': return ppkg[1:] else: return ppkg def getdeps(pkg): p = os.popen("apt-cache show " + pkg) reply = p.read() p.close() m = re.search("\nDepends: ([^\n]+)\n", reply) if not m: return [] deplist = [] depstr = m.groups(1)[0] + "," deps = re.finditer(" *([^,]+),", depstr) if not deps: raise "!match groups" for dep in [m.group(1) for m in deps]: alt = dep.find('|') != -1 pkgs = re.finditer(" *([^|]+)", dep) if not pkgs: raise "!match pkgs" for pkg in [m.groups(1)[0] for m in pkgs]: name_m = re.search(" *([^( ]+) *(\\(.+\\))?", pkg) if not name_m: raise "!match name" name = name_m.groups(1)[0] if alt: name = '|' + name deplist.append(name) return deplist def deptree(ppkg, pool = {}, depth = 0): pkg = stripmod(ppkg) pool[pkg] = True seen = [] unseen = [] for dep in getdeps(pkg): if pool.has_key(dep): seen.append(dep) else: unseen.append(dep) seen_list = ' '.join(seen) if seen_list: seen_list = "(seen: %s)" % seen_list print ''.join(['.' for i in xrange(depth)]) + ppkg, seen_list for dep in unseen: deptree(dep, pool, depth + 1) if __name__ == "__main__": if len(sys.argv) < 2: print "syntax: %s pkgname" % sys.argv[0] sys.exit() deptree(sys.argv[1])