diff options
Diffstat (limited to 'gitosis/group.py')
-rw-r--r-- | gitosis/group.py | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gitosis/group.py b/gitosis/group.py new file mode 100644 index 0000000..0ecbb61 --- /dev/null +++ b/gitosis/group.py @@ -0,0 +1,42 @@ +import logging +from ConfigParser import NoSectionError, NoOptionError + +def getMembership(config, user, _seen=None): + """ + Generate groups ``user`` is member of, according to ``config`` + + :type config: RawConfigParser + :type user: str + :param _seen: internal use only + """ + log = logging.getLogger('gitosis.group.getMembership') + + if _seen is None: + _seen = set() + + for section in config.sections(): + GROUP_PREFIX = 'group ' + if not section.startswith(GROUP_PREFIX): + continue + group = section[len(GROUP_PREFIX):] + if group in _seen: + continue + + try: + members = config.get(section, 'members') + except (NoSectionError, NoOptionError): + members = [] + else: + members = members.split() + + if user in members: + log.debug('found %(user)r in %(group)r' % dict( + user=user, + group=group, + )) + _seen.add(group) + yield group + + for member_of in getMembership(config, '@%s' % group, + _seen=_seen): + yield member_of |