aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTommi Virtanen <tv@eagain.net>2007-06-04 14:22:54 +0300
committerTommi Virtanen <tv@eagain.net>2007-06-04 14:22:54 +0300
commit7b99ae75833314a85dc5a1a51183620d917c29d6 (patch)
treee5269336681568f02dfa1113e1b6cef628d61a76
parentgitosis/serve.py is not meant to be a script, remove #! (diff)
downloadgitosis-dakkar-7b99ae75833314a85dc5a1a51183620d917c29d6.tar.gz
gitosis-dakkar-7b99ae75833314a85dc5a1a51183620d917c29d6.tar.bz2
gitosis-dakkar-7b99ae75833314a85dc5a1a51183620d917c29d6.zip
Add config option ``repositories``, for giving a path prefix to repositories.
Both global and relative (to home directory) values work, can be given in global section ``[gitosis]`` or in the ``[group FOO]`` section for just that group.
-rw-r--r--example.conf4
-rw-r--r--gitosis/access.py59
-rw-r--r--gitosis/test/test_access.py43
3 files changed, 88 insertions, 18 deletions
diff --git a/example.conf b/example.conf
index 9e86d0a..935dccc 100644
--- a/example.conf
+++ b/example.conf
@@ -1,5 +1,5 @@
-# TODO commented sections not done yet
-# [gitosis]
+[gitosis]
+repositories = repo
[group quux]
members = jdoe wsmith @anothergroup
diff --git a/gitosis/access.py b/gitosis/access.py
index 1146c2d..77be0c8 100644
--- a/gitosis/access.py
+++ b/gitosis/access.py
@@ -1,4 +1,4 @@
-import logging
+import os, logging
from ConfigParser import NoSectionError, NoOptionError
from gitosis import group
@@ -31,6 +31,8 @@ def haveAccess(config, user, mode, path):
else:
repos = repos.split()
+ mapping = None
+
if path in repos:
log.debug(
'Access ok for %(user)r as %(mode)r on %(path)r'
@@ -39,20 +41,45 @@ def haveAccess(config, user, mode, path):
mode=mode,
path=path,
))
- return path
-
- try:
- mapping = config.get('group %s' % groupname,
- 'map %s %s' % (mode, path))
- except (NoSectionError, NoOptionError):
- pass
+ mapping = path
else:
- log.debug(
- 'Access ok for %(user)r as %(mode)r on %(path)r=%(mapping)r'
- % dict(
- user=user,
- mode=mode,
- path=path,
- mapping=mapping,
- ))
+ try:
+ mapping = config.get('group %s' % groupname,
+ 'map %s %s' % (mode, path))
+ except (NoSectionError, NoOptionError):
+ pass
+ else:
+ log.debug(
+ 'Access ok for %(user)r as %(mode)r on %(path)r=%(mapping)r'
+ % dict(
+ user=user,
+ mode=mode,
+ path=path,
+ mapping=mapping,
+ ))
+
+ if mapping is not None:
+ prefix = None
+ try:
+ prefix = config.get(
+ 'group %s' % groupname, 'repositories')
+ except (NoSectionError, NoOptionError):
+ try:
+ prefix = config.get('gitosis', 'repositories')
+ except (NoSectionError, NoOptionError):
+ pass
+
+ if prefix is not None:
+ log.debug(
+ 'Using prefix %(prefix)r for %(path)r'
+ % dict(
+ prefix=prefix,
+ path=mapping,
+ ))
+ mapping = os.path.join(prefix, mapping)
+ log.debug(
+ 'New path is %(path)r'
+ % dict(
+ path=mapping,
+ ))
return mapping
diff --git a/gitosis/test/test_access.py b/gitosis/test/test_access.py
index 00b1fe8..6e41a99 100644
--- a/gitosis/test/test_access.py
+++ b/gitosis/test/test_access.py
@@ -77,3 +77,46 @@ def test_read_yes_map_wouldHaveWritable():
cfg.set('group fooers', 'map writable foo/bar', 'quux/thud')
eq(access.haveAccess(config=cfg, user='jdoe', mode='readonly', path='foo/bar'),
None)
+
+def test_base_global_absolute():
+ cfg = RawConfigParser()
+ cfg.add_section('gitosis')
+ cfg.set('gitosis', 'repositories', '/a/leading/path')
+ cfg.add_section('group fooers')
+ cfg.set('group fooers', 'members', 'jdoe')
+ cfg.set('group fooers', 'map writable foo/bar', 'baz/quux/thud')
+ eq(access.haveAccess(
+ config=cfg, user='jdoe', mode='writable', path='foo/bar'),
+ '/a/leading/path/baz/quux/thud')
+
+def test_base_global_relative():
+ cfg = RawConfigParser()
+ cfg.add_section('gitosis')
+ cfg.set('gitosis', 'repositories', 'some/relative/path')
+ cfg.add_section('group fooers')
+ cfg.set('group fooers', 'members', 'jdoe')
+ cfg.set('group fooers', 'map writable foo/bar', 'baz/quux/thud')
+ eq(access.haveAccess(
+ config=cfg, user='jdoe', mode='writable', path='foo/bar'),
+ 'some/relative/path/baz/quux/thud')
+
+def test_base_global_relative_simple():
+ cfg = RawConfigParser()
+ cfg.add_section('gitosis')
+ cfg.set('gitosis', 'repositories', 'some/relative/path')
+ cfg.add_section('group fooers')
+ cfg.set('group fooers', 'members', 'jdoe')
+ cfg.set('group fooers', 'readonly', 'foo xyzzy bar')
+ eq(access.haveAccess(
+ config=cfg, user='jdoe', mode='readonly', path='xyzzy'),
+ 'some/relative/path/xyzzy')
+
+def test_base_local():
+ cfg = RawConfigParser()
+ cfg.add_section('group fooers')
+ cfg.set('group fooers', 'repositories', 'some/relative/path')
+ cfg.set('group fooers', 'members', 'jdoe')
+ cfg.set('group fooers', 'map writable foo/bar', 'baz/quux/thud')
+ eq(access.haveAccess(
+ config=cfg, user='jdoe', mode='writable', path='foo/bar'),
+ 'some/relative/path/baz/quux/thud')