So I was helping one Canola2 user to uninstall the old version and for some strange reason apt-get remove libeet0 libevas0 libecore0 libembryo0 libdownloadmanager0 was breaking with "Abort" message. Ok, use dpkg instead, I said, but since we now have split packages for all the libs we use, you'll end with a dependency nightmare.
Solution? Hack a quick script to get dpkg errors, parse them and generate a new command line with proper ordering:
#!/usr/bin/python
import sys
pkgs = {}
infile = open(sys.argv[1])
pkg = None
for line in infile:
line = line[:-1] # chomp n
tokens = line.split()
head = tokens[0]
if head == "dpkg:":
if tokens[1] != "dependency":
continue
pkg = tokens[-1][:-1]
pkgs.setdefault(pkg, set())
elif head in ("Package", "dpkg", "dependency"):
continue
elif head == "Errors":
break # follows a list of problematic packages
else:
if tokens[1:3] == ['depends', 'on']:
pkgs[pkg].add(head)
def unique_extend(lst, extent):
for e in extent:
if e not in lst:
lst.append(e)
def rm_pkg(p, pkgs):
rm_list = []
try:
ddeps = pkgs[p]
except KeyError:
return [] # no deps!
for d in ddeps:
unique_extend(rm_list, rm_pkg(d, pkgs) + [d])
return rm_list
rm_list = []
for p in pkgs:
unique_extend(rm_list, rm_pkg(p, pkgs) + [p])
print "dpkg --purge", " ".join(rm_list)
Not that efficient, but simple enough.