aboutsummaryrefslogtreecommitdiff
blob: 82d894b4067a7b5251435442f1fbf410e3acaf6b (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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/python
# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# Written by Robert Buchholz <rbu@gentoo.org>

import sys
import os
import re
try:
    import xml.etree.ElementTree as et
except ImportError:
    import elementtree.ElementTree as et

PORTDIR = "/usr/portage"
HERDS = PORTDIR + "/metadata/herds.xml"
heXML = None

def uniq(seq):
    """ order preserving unique """
    seen = {}
    result = []
    for item in seq:
        if not item in seen:
            seen[item] = 1
            result.append(item)
    return result

def get_pkg_cat(string):
    """ returns a list with packages or categories found that exist in portdir """
    metadatadirs = []

    matches = re.findall(r"(?#start:   )(?:^|\s)[<>~=]*(?#\
                              cat:     )([A-Za-z0-9+_][A-Za-z0-9+_.-]*/(?#\
                              pnv:     )[A-Za-z0-9+_][A-Za-z0-9+_.:@-]*)", string)

    for name in matches:
        # remove versions at the end
        name = re.sub(r"(?#version:   )-[0-9.]+[a-z]?(?#\
                           additions: )(_(alpha|beta|pre|rc|p)[0-9]*)?(?#\
                           revisions: )(-r[0-9]*)?(?#\
                           usedeps:   )(\[[!=?A-Za-z0-9+_@-]+\])?(?#\
                           slot deps: )(:[A-Za-z0-9+_.-]*)?$", "", name)

        if os.path.isdir("%s/%s" % (PORTDIR, name)):
            metadatadirs.append(name)
        else:
            (cat, _) = name.split('/', 1)
            if os.path.isdir("%s/%s" % (PORTDIR, cat)):
                metadatadirs.append(cat)

    return metadatadirs

def get_maintainer_for(directory):
    """ returns a priority-sorted list of maintainers for a given CAT or CAT/PN """
    cc = []
    try:
        if not heXML:
            globals()['heXML'] = et.parse(HERDS)
        meXML = et.parse("%s/%s/metadata.xml" % (PORTDIR, directory))

        for elem in meXML.getiterator():
            if elem.tag == "herd":
                for thisherd in heXML.findall("/herd"):
                    if thisherd.findtext("name") == elem.text:
                        herdmail = thisherd.findtext("email")
                        if herdmail:
                            cc.append(herdmail)
            elif elem.tag == "maintainer":
                email = elem.findtext("email")
                if not email:
                    continue
                if elem.get('ignoreauto') == "1" and elem.get('role'):
                    if email in cc:
                        cc.remove(email)
                else:
                    cc.append(email)

    except Exception:
        pass
    return cc

def get_cc_from_string(string):
    """ returns an ordered list of bug assignees / ccs for an arbitrary string such as
        a bug title. the first element of the tuple (if present) is supposed to be the
        assignee of the bug. """
    ccs = []
    metadatadirs = get_pkg_cat(string)
    for dir in metadatadirs:
        ccs.extend(get_maintainer_for(dir))

    # remove dupes
    ccs = uniq(ccs)
    return ccs

def main():
    if len(sys.argv) < 1:
        return
    arg = " ".join(sys.argv[1:])

    ccs = get_cc_from_string(arg)

    if len(ccs) > 0:
        print "assign-to: %s" % (ccs[0])
        print "cc: %s" % (",".join(ccs[1:]))


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print '\n ! Exiting.'