Skip to content

Instantly share code, notes, and snippets.

@sylvandb
Created June 18, 2020 18:47
Show Gist options
  • Save sylvandb/4935a664183ecd144dcfd974253c8e8d to your computer and use it in GitHub Desktop.
Save sylvandb/4935a664183ecd144dcfd974253c8e8d to your computer and use it in GitHub Desktop.
debtree to show debian package dependencies, inspired by pactree
#!/usr/bin/env python3
# show deb package dependency tree
import subprocess
INDENT = " "
DPCONT = "│ "
DPMORE = "├─"
DPLAST = "└─"
#DPCONT = " "
#DPMORE = ""
#DPLAST = ""
#DPCONT = "| "
#DPMORE = "+-"
#DPLAST = "`-"
NEXTINDENT = INDENT * 2
NEXTCONTIN = DPCONT + INDENT
RDEP = "apt-rdepends"
def get_deplist(pkg):
return subprocess.run((RDEP, pkg), capture_output=True, text=True).stdout.split('\n')
parsetree = []
parsed = {}
def parse_deplist(pkg, deplist):
def tree_for_el(el, seen=[]):
if el in seen:
return (el + ' ^', [])
seen.append(el)
return (el, [tree_for_el(d) for d in parsed[el]])
def dependents(ilines):
d = []
for l in ilines:
kw = l.split()
if not kw or kw[0] != 'Depends:':
break
d.append(kw[1])
return l, d
parsed.clear()
del parsetree[:]
ideplist = iter(deplist)
# skip intro
while True:
l = next(ideplist)
if not l or l.startswith(pkg):
break
# process the list
while l:
nextl, deps = dependents(ideplist)
parsed[l] = deps
l = nextl
parsetree.append(tree_for_el(pkg))
def output_tree():
def output_key(key, deps, last=[]):
if last:
indent = INDENT + ''.join(NEXTINDENT if l else NEXTCONTIN for l in last[:-1])
leader = DPLAST if last[-1] else DPMORE
else:
indent = ''
leader = ''
myline = ["%s%s%s" % (indent, leader, key)]
for d in (output_key(k, d, last=last+[(k,d)==deps[-1]]) for k, d in deps):
myline.extend(d)
return myline
return output_key(parsetree[0][0], parsetree[0][1])
if __name__ == "__main__":
import sys
if len(sys.argv) != 2:
print('Usage: %s <package>' % sys.argv[0])
sys.exit(1)
try:
deplist = get_deplist(sys.argv[1])
except FileNotFoundError as e:
print("Requires %s: %s" % (RDEP, e))
sys.exit(1)
parse_deplist(sys.argv[1], deplist)
#print(parsed); print(parsetree); return
print('\n'.join(output_tree()))
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment