aboutsummaryrefslogtreecommitdiff
path: root/gitosis/group.py
blob: 0ecbb6101b5652ab8be6292bb1d6d2754ba99fba (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
import logging
from ConfigParser import NoSectionErrorNoOptionError
 
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 (NoSectionErrorNoOptionError):
            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