diff options
Diffstat (limited to 'pym/repoman/herdbase.py')
-rw-r--r-- | pym/repoman/herdbase.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/pym/repoman/herdbase.py b/pym/repoman/herdbase.py new file mode 100644 index 000000000..3734a2f0a --- /dev/null +++ b/pym/repoman/herdbase.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +# repoman: Herd database analysis +# Copyright 2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id: $ + +import xml.etree.ElementTree as ET +from xml.parsers.expat import ExpatError +from portage.exception import ParseError + +__all__ = [ + "make_herd_base" +] + +_SPECIAL_HERDS = set(('no-herd',)) + +def _make_email(nick_name): + if not nick_name.endswith('@gentoo.org'): + nick_name = nick_name + '@gentoo.org' + return nick_name + + +class HerdBase(object): + def __init__(self, herd_to_emails, all_emails): + self.herd_to_emails = herd_to_emails + self.all_emails = all_emails + + def known_herd(self, herd_name): + if herd_name in _SPECIAL_HERDS: + return True + return herd_name in self.herd_to_emails + + def known_maintainer(self, nick_name): + return _make_email(nick_name) in self.all_emails + + def maintainer_in_herd(self, nick_name, herd_name): + return _make_email(nick_name) in self.herd_to_emails[herd_name] + + +def make_herd_base(filename): + herd_to_emails = dict() + all_emails = set() + + try: + xml_tree = ET.parse(filename) + except ExpatError as e: + raise ParseError("metadata.xml: " + str(e)) + + herds = xml_tree.findall('herd') + for h in herds: + _herd_name = h.find('name') + if _herd_name is None: + continue + herd_name = _herd_name.text.strip() + del _herd_name + + maintainers = h.findall('maintainer') + herd_emails = set() + for m in maintainers: + _m_email = m.find('email') + if _m_email is None: + continue + m_email = _m_email.text.strip() + + herd_emails.add(m_email) + all_emails.add(m_email) + + herd_to_emails[herd_name] = herd_emails + + return HerdBase(herd_to_emails, all_emails) + + +if __name__ == '__main__': + h = make_herd_base('/usr/portage/metadata/herds.xml') + + assert(h.known_herd('sound')) + assert(not h.known_herd('media-sound')) + + assert(h.known_maintainer('sping')) + assert(h.known_maintainer('sping@gentoo.org')) + assert(not h.known_maintainer('portage')) + + assert(h.maintainer_in_herd('zmedico@gentoo.org', 'tools-portage')) + assert(not h.maintainer_in_herd('pva@gentoo.org', 'tools-portage')) + + import pprint + pprint.pprint(h.herd_to_emails) |