aboutsummaryrefslogtreecommitdiff
path: root/gitosis/group.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitosis/group.py')
-rw-r--r--gitosis/group.py42
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