summaryrefslogtreecommitdiff
blob: 121e2788a411e9e58c7be8862c23d465e14cda2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/python
# -*- coding: utf-8 -*-

""" Checks what slots are used for a package in its reverse dependencies. """

import portage

import sys
#from pprint import pprint

def main():
    trees = portage.create_trees()
    trees["/"]["porttree"].settings = portage.settings
    portdb = trees["/"]["porttree"]
    portdb.dbapi.settings = portage.settings
    portdb.dbapi.porttrees = [portage.portdb.porttree_root]

    # does it make sense to remove _all_ useless stuff or just leave it as it is?
    #portdb.dbapi._aux_cache_keys.clear()
    #portdb.dbapi._aux_cache_keys.update(["EAPI", "KEYWORDS", "SLOT"])

    res_slots = {}

    # Loop through all package names
    for cp in portdb.dbapi.cp_all():
        #print(cp)

        # Get versions
        cpvrs = portdb.dbapi.xmatch('match-all', cp)

        # Group by slots
        slots = {}
        for cpvr in cpvrs:
            slot = portdb.dbapi.aux_get(cpvr, ["SLOT"])[0]
            if slot is None:
                slot = 0
            if not slot in slots:
                slots[slot] = []
            slots[slot].append(cpvr)

        # XXX: Walk through slots (walk twice for ~arch and arch)
        for slot in sorted(slots):
            cpvr = portage.versions.best(slots[slot])
            depends = portdb.dbapi.aux_get(cpvr, ['DEPEND', 'RDEPEND', 'PDEPEND'])
            depends = set(portage.dep.use_reduce(' '.join(depends), matchall=True, flat=True))
            depends = [dep for dep in depends if portage.dep.isvalidatom(dep)]

            #print('DEPEND:')
            #pprint(depends)

            for depend in depends:
                if portage.dep.dep_getkey(depend) == sys.argv[1]:
                    mypkg_slot = portage.dep.dep_getslot(depend)
                    if mypkg_slot is None:
                        mypkg_slot = "unset"

                    if mypkg_slot not in res_slots:
                        res_slots[mypkg_slot] = [(cpvr, depend)]
                    else:
                        res_slots[mypkg_slot].append((cpvr, depend))
                    #print(portage.dep.dep_getkey(depend) + ' uses ' + sys.argv[1] + ' slot ' +  portage.dep.dep_getslot(depend))

    for slot in sorted(res_slots):
        print('%s:%s' % (sys.argv[1], slot))
        for rescpv in res_slots[slot]:
            print('    %s (as %s)' % rescpv)


if __name__ == "__main__":
    main()

## vim:set sts=4 ts=4 sw=4 expandtab: