aboutsummaryrefslogtreecommitdiff
path: root/gitosis/gitdaemon.py
diff options
context:
space:
mode:
Diffstat (limited to 'gitosis/gitdaemon.py')
-rw-r--r--gitosis/gitdaemon.py101
1 files changed, 65 insertions, 36 deletions
diff --git a/gitosis/gitdaemon.py b/gitosis/gitdaemon.py
index 78ca9ea..1e43047 100644
--- a/gitosis/gitdaemon.py
+++ b/gitosis/gitdaemon.py
@@ -1,32 +1,41 @@
+"""
+Gitosis git-daemon functionality.
+
+Handles the ``git-daemon-export-ok`` marker files for all repositories managed
+by Gitosis.
+"""
import errno
import logging
import os
-from ConfigParser import NoSectionError, NoOptionError
-
+# C0103 - 'log' is a special name
+# pylint: disable-msg=C0103
log = logging.getLogger('gitosis.gitdaemon')
from gitosis import util
+from gitosis.configutil import getboolean_default
def export_ok_path(repopath):
- p = os.path.join(repopath, 'git-daemon-export-ok')
- return p
+ """
+ Return the path the ``git-daemon-export-ok`` marker for a given repository.
+ """
+ path = os.path.join(repopath, 'git-daemon-export-ok')
+ return path
def allow_export(repopath):
- p = export_ok_path(repopath)
- file(p, 'a').close()
+ """Create the ``git-daemon-export-ok`` marker for a given repository."""
+ path = export_ok_path(repopath)
+ file(path, 'a').close()
def deny_export(repopath):
- p = export_ok_path(repopath)
- try:
- os.unlink(p)
- except OSError, e:
- if e.errno == errno.ENOENT:
- pass
- else:
- raise
+ """Remove the ``git-daemon-export-ok`` marker for a given repository."""
+ path = export_ok_path(repopath)
+ util.unlink(path)
def _extract_reldir(topdir, dirpath):
+ """
+ Find the relative directory given a base directory & a child directory.
+ """
if topdir == dirpath:
return '.'
prefix = topdir + '/'
@@ -34,25 +43,53 @@ def _extract_reldir(topdir, dirpath):
reldir = dirpath[len(prefix):]
return reldir
-def set_export_ok(config):
- repositories = util.getRepositoryDir(config)
-
- try:
- global_enable = config.getboolean('gitosis', 'daemon')
- except (NoSectionError, NoOptionError):
- global_enable = False
+def _is_global_repo_export_ok(config):
+ """
+ Does the global Gitosis configuration allow daemon exporting?
+ """
+ global_enable = getboolean_default(config, 'gitosis', 'daemon', False)
log.debug(
'Global default is %r',
{True: 'allow', False: 'deny'}.get(global_enable),
)
+ return global_enable
- def _error(e):
- if e.errno == errno.ENOENT:
+def _is_repo_export_ok(global_enable, config, reponame):
+ """
+ Does the Gitosis configuration for the named reposistory allow daemon
+ exporting?
+ """
+ section = 'repo %s' % reponame
+ return getboolean_default(config, section, 'daemon', global_enable)
+
+def _set_export_ok_single(enable, name, dirpath, repo):
+ """
+ Manage the ``git-daemon-export-ok`` marker for a single repository.
+ """
+ repopath = os.path.join(dirpath, repo)
+ if enable:
+ log.debug('Allow %r', name)
+ allow_export(repopath)
+ else:
+ log.debug('Deny %r', name)
+ deny_export(repopath)
+
+def set_export_ok(config):
+ """
+ Walk all repositories owned by Gitosis, and manage the
+ ``git-daemon-export-ok`` markers.
+ """
+ repositories = util.getRepositoryDir(config)
+ global_enable = _is_global_repo_export_ok(config)
+
+ def _error(ex): #pragma: no cover
+ """Ignore non-existant items."""
+ if ex.errno == errno.ENOENT:
pass
else:
- raise e
+ raise ex
- for (dirpath, dirnames, filenames) \
+ for (dirpath, dirnames, _) \
in os.walk(repositories, onerror=_error):
# oh how many times i have wished for os.walk to report
# topdir and reldir separately, instead of dirpath
@@ -77,14 +114,6 @@ def set_export_ok(config):
if reldir != '.':
name = os.path.join(reldir, name)
assert ext == '.git'
- try:
- enable = config.getboolean('repo %s' % name, 'daemon')
- except (NoSectionError, NoOptionError):
- enable = global_enable
-
- if enable:
- log.debug('Allow %r', name)
- allow_export(os.path.join(dirpath, repo))
- else:
- log.debug('Deny %r', name)
- deny_export(os.path.join(dirpath, repo))
+
+ enable = _is_repo_export_ok(global_enable, config, name)
+ _set_export_ok_single(enable, name, dirpath, repo)