aboutsummaryrefslogtreecommitdiff
path: root/gitosis/init.py
diff options
context:
space:
mode:
authorTommi Virtanen <tv@eagain.net>2007-09-03 17:04:41 -0700
committerTommi Virtanen <tv@eagain.net>2007-09-03 17:09:12 -0700
commit8a0654abe2db919b04683d40100b469e8c3adc4b (patch)
tree57903f32603cc57bd894c62ec2a0fa87d0985e15 /gitosis/init.py
parentMake setuptools include templates in the egg. (diff)
downloadgitosis-dakkar-8a0654abe2db919b04683d40100b469e8c3adc4b.tar.gz
gitosis-dakkar-8a0654abe2db919b04683d40100b469e8c3adc4b.tar.bz2
gitosis-dakkar-8a0654abe2db919b04683d40100b469e8c3adc4b.zip
Refactor command line utilities to share setup.
Hide internal gitosis-ssh and gitosis-gitweb, it's all in gitosis-run-hook.
Diffstat (limited to 'gitosis/init.py')
-rw-r--r--gitosis/init.py114
1 files changed, 46 insertions, 68 deletions
diff --git a/gitosis/init.py b/gitosis/init.py
index bf0eb9b..ba2e4c6 100644
--- a/gitosis/init.py
+++ b/gitosis/init.py
@@ -4,7 +4,6 @@ Initialize a user account for use with gitosis.
import errno
import logging
-import optparse
import os
import re
import subprocess
@@ -16,13 +15,10 @@ from ConfigParser import RawConfigParser
from gitosis import repository
from gitosis import util
+from gitosis import app
log = logging.getLogger('gitosis.init')
-def die(msg):
- log.error(msg)
- sys.exit(1)
-
def read_ssh_pubkey(fp=None):
if fp is None:
fp = sys.stdin
@@ -55,6 +51,12 @@ def initial_commit(git_dir, cfg, pubkey, user):
],
)
+class PostUpdateFailedError(Exception):
+ """post-update hook failed"""
+
+ def __str__(self):
+ return '%s: %s' % (self.__doc__, ': '.join(self.args))
+
def run_post_update(git_dir):
args = [os.path.join(git_dir, 'hooks', 'post-update')]
returncode = subprocess.call(
@@ -64,10 +66,7 @@ def run_post_update(git_dir):
env=dict(GIT_DIR='.'),
)
if returncode != 0:
- die(
- ("post-update returned non-zero exit status %d"
- % returncode),
- )
+ raise PostUpdateFailedError('exit status %d' % returncode)
def symlink_config(git_dir):
dst = os.path.expanduser('~/.gitosis.conf')
@@ -85,20 +84,6 @@ def symlink_config(git_dir):
)
os.rename(tmp, dst)
-def getParser():
- parser = optparse.OptionParser(
- usage='%prog',
- description='Initialize a user account for use with gitosis',
- )
- parser.set_defaults(
- config=os.path.expanduser('~/.gitosis.conf'),
- )
- parser.add_option('--config',
- metavar='FILE',
- help='read config from FILE',
- )
- return parser
-
def init_admin_repository(
git_dir,
pubkey,
@@ -130,49 +115,42 @@ def init_admin_repository(
user=user,
)
-def main():
- logging.basicConfig(level=logging.INFO)
- os.umask(0022)
-
- parser = getParser()
- (options, args) = parser.parse_args()
- if args:
- parser.error('Did not expect arguments.')
-
- cfg = RawConfigParser()
- try:
- conffile = file(options.config)
- except (IOError, OSError), e:
- if e.errno == errno.ENOENT:
- # not existing is ok
- pass
- else:
- # I trust the exception has the path.
- die("Unable to read config file: %s." % e)
- else:
+class Main(app.App):
+ def create_parser(self):
+ parser = super(Main, self).create_parser()
+ parser.set_usage('%prog [OPTS]')
+ parser.set_description(
+ 'Initialize a user account for use with gitosis')
+ return parser
+
+ def handle_args(self, parser, cfg, options, args):
+ super(Main, self).handle_args(parser, cfg, options, args)
+
+ logging.basicConfig(level=logging.INFO)
+ os.umask(0022)
+
+ log.info('Reading SSH public key...')
+ pubkey = read_ssh_pubkey()
+ user = ssh_extract_user(pubkey)
+ if user is None:
+ log.error('Cannot parse user from SSH public key.')
+ sys.exit(1)
+ log.info('Admin user is %r', user)
+ log.info('Creating repository structure...')
+ repositories = util.getRepositoryDir(cfg)
+ util.mkdir(repositories)
+ admin_repository = os.path.join(repositories, 'gitosis-admin.git')
+ init_admin_repository(
+ git_dir=admin_repository,
+ pubkey=pubkey,
+ user=user,
+ )
+ log.info('Running post-update hook...')
try:
- cfg.readfp(conffile)
- finally:
- conffile.close()
-
-
- log.info('Reading SSH public key...')
- pubkey = read_ssh_pubkey()
- user = ssh_extract_user(pubkey)
- if user is None:
- die('Cannot parse user from SSH public key.')
- log.info('Admin user is %r', user)
- log.info('Creating repository structure...')
- repositories = util.getRepositoryDir(cfg)
- util.mkdir(repositories)
- admin_repository = os.path.join(repositories, 'gitosis-admin.git')
- init_admin_repository(
- git_dir=admin_repository,
- pubkey=pubkey,
- user=user,
- )
- log.info('Running post-update hook...')
- run_post_update(git_dir=admin_repository)
- log.info('Symlinking ~/.gitosis.conf to repository...')
- symlink_config(git_dir=admin_repository)
- log.info('Done.')
+ run_post_update(git_dir=admin_repository)
+ except PostUpdateFailedError, e:
+ log.error('%s', e)
+ sys.exit(1)
+ log.info('Symlinking ~/.gitosis.conf to repository...')
+ symlink_config(git_dir=admin_repository)
+ log.info('Done.')