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()

Reply via email to