I wrote this script awhile back that I used to clean up my world file. It
doesn't
actually clean the file, just reports on possible ways to do it. You can run it
like
# auditworld < /var/lib/package/world
Feel free to use it if you find it useful.
-a
#!/usr/bin/python
"""
Report any packages in world which have direct dependencies also in world
"""
__version__ = (0,3,0)
import os
import sys
sys.path.insert(0, '/usr/lib/gentoolkit/pym')
os.environ['PORTAGE_CALLER'] = 'repoman'
import portage
TREE = portage.db["/"]["vartree"]
import gentoolkit
def get_versions_installed(pkg):
"""
Return a list containt versions of pkg installed (in cpv format)
may be an empty list.
"""
return TREE.dbapi.match(pkg)
def get_world():
"""Return a list of all packages in world"""
_file = sys.stdin
_list = [line.strip() for line in _file]
return _list
def get_deps(pkg):
"""Return a list of all packages depending on pkg (directly)"""
deps = set()
for cpv in get_versions_installed(pkg):
gentoolkit_pkg = gentoolkit.Package(cpv)
rdeps = [i[2] for i in gentoolkit_pkg.get_runtime_deps() if not
i[2].startswith('virtual/')]
for rdep in rdeps:
split = portage.pkgsplit(rdep)
if split is not None:
deps.add(split[0])
else:
deps.add(rdep)
pdeps = [i[2] for i in gentoolkit_pkg.get_postmerge_deps() if not
i[2].startswith('virtual/')]
for pdep in pdeps:
split = portage.pkgsplit(pdep)
if split is not None:
deps.add(split[0])
else:
deps.add(pdep)
#print deps
#command= '/usr/bin/equery -q -C d %s' % pkg
#pipe = os.popen(command, 'r')
#_list = [portage.pkgsplit(line.strip())[0] for line in pipe]
return deps
if __name__ == '__main__':
world = get_world()
for pkg in world:
deps = get_deps(pkg)
for dep in deps:
if (dep != pkg) and (dep in world):
print '%(pkg)s already depends on %(dep)s' % locals()