diff options
-rw-r--r-- | 000.yarn | 18 | ||||
-rw-r--r-- | lib.py | 56 | ||||
-rw-r--r-- | yarnhelper.py | 43 |
3 files changed, 64 insertions, 53 deletions
@@ -276,7 +276,7 @@ WHEN admin creates user None, 'user add {} {}@example.com Test {}'.format( username, username, username)) - pubkey = helper.ssh_keygen(username) + pubkey = ssh_keygen(username) gitano(None, 'as {} sshkey add default'.format(username), stdin=pubkey) @@ -314,14 +314,14 @@ WHEN admin created repository user = 'admin' url = helper.repo_ssh_url(repo) dirname = helper.local_checkout_dirname(user, repo) - helper.git_as_checked(None, ['clone', url, dirname]) + git_as_checked(None, ['clone', url, dirname]) cliapp.runcmd(['git', 'config', 'user.email', user], cwd=dirname) cliapp.runcmd(['git', 'config', 'user.name', user], cwd=dirname) with open(os.path.join(dirname, 'foo.txt'), 'a') as f: f.write('') cliapp.runcmd(['git', 'add', 'foo.txt'], cwd=dirname) cliapp.runcmd(['git', 'commit', '-mfoo'], cwd=dirname) - helper.git_as_checked(None, ['push', '--all'], cwd=dirname) + git_as_checked(None, ['push', '--all'], cwd=dirname) WHEN admin sets repository config ----------------------------------------------------------------------------- @@ -340,7 +340,7 @@ THEN a user can clone a repository repo = get_next_match() url = helper.repo_ssh_url(repo) dirname = helper.local_checkout_dirname(user, repo) - helper.git_as_checked(user, ['clone', url, dirname]) + git_as_checked(user, ['clone', url, dirname]) cliapp.runcmd(['git', 'config', 'user.email', user], cwd=dirname) cliapp.runcmd(['git', 'config', 'user.name', user], cwd=dirname) @@ -352,7 +352,7 @@ THEN a user can't clone a repository repo = get_next_match() url = helper.repo_ssh_url(repo) dirname = helper.local_checkout_dirname(user, repo) - exit, out, err = helper.git_as(user, ['clone', url, dirname]) + exit, out, err = git_as(user, ['clone', url, dirname]) helper.assertNotEqual(exit, 0) THEN a repository can be cloned over the git protocol @@ -396,7 +396,7 @@ THEN a user can push all local branches repo = get_next_match() url = helper.repo_ssh_url(repo) dirname = helper.local_checkout_dirname(user, repo) - helper.git_as_checked(user, ['push', '--all', 'origin'], cwd=dirname) + git_as_checked(user, ['push', '--all', 'origin'], cwd=dirname) THEN a user can push all local tags ----------------------------------------------------------------------------- @@ -406,7 +406,7 @@ THEN a user can push all local tags repo = get_next_match() url = helper.repo_ssh_url(repo) dirname = helper.local_checkout_dirname(user, repo) - helper.git_as_checked(user, ['push', '--tags', 'origin'], cwd=dirname) + git_as_checked(user, ['push', '--tags', 'origin'], cwd=dirname) THEN a user can't push local branches ----------------------------------------------------------------------------- @@ -415,7 +415,7 @@ THEN a user can't push local branches user = get_next_match() repo = get_next_match() dirname = helper.local_checkout_dirname(user, repo) - exit, out, err = helper.git_as( + exit, out, err = git_as( user, ['push', '--all', 'origin'], cwd=dirname) sys.stdout.write(out) @@ -429,7 +429,7 @@ THEN a user can't push local tags user = get_next_match() repo = get_next_match() dirname = helper.local_checkout_dirname(user, repo) - exit, out, err = helper.git_as( + exit, out, err = git_as( user, ['push', '--tags', 'origin'], cwd=dirname) helper.assertNotEqual(exit, 0) @@ -1,4 +1,5 @@ import os +import subprocess import sys import cliapp @@ -15,6 +16,59 @@ vars = Variables(datadir) + +def ssh_key_file_for_user(user): + return os.path.abspath('{}.key'.format(user)) + + +def get_admin_ssh_key(): + return os.environ['ADMIN_SSH_KEY'] + + +def get_user_ssh_key(user): + if user is None: + return get_admin_ssh_key() + else: + return ssh_key_file_for_user(user) + + +def ssh_keygen(user): + filename = ssh_key_file_for_user(user) + cliapp.runcmd(['ssh-keygen', '-f', filename, '-N', '', '-C', user]) + with open(filename + '.pub') as f: + return f.read() + + +def env_ssh_command(user): + argv = [ + 'ssh', + '-o', 'PasswordAuthentication=no', + '-o', 'IdentitiesOnly=yes', + '-i', get_user_ssh_key(user), + ] + return ' '.join(argv) + + + +def git_as(user, args, **kwargs): + server = os.environ['GITANO_SERVER'] + env = dict(os.environ) + env['GIT_SSH_COMMAND'] = env_ssh_command(user) + return cliapp.runcmd_unchecked( + ['git'] + args, + stderr=subprocess.STDOUT, + env=env, + **kwargs) + + + +def git_as_checked(user, args, **kwargs): + exit, out, err = git_as(user, args, **kwargs) + sys.stdout.write('STDOUT from git:\n{}'.format(out)) + sys.stderr.write('STDERR from git:\n{}'.format(err)) + assertEqual(exit, 0) + + def gitano(user, args, stdin=None): server = os.environ['GITANO_SERVER'] kwargs = { @@ -22,7 +76,7 @@ def gitano(user, args, stdin=None): 'ssh_options': [ '-oPasswordAuthentication=no', '-oIdentitiesOnly=yes', - '-i', self.get_user_ssh_key(user), + '-i', get_user_ssh_key(user), ], } if stdin is not None: diff --git a/yarnhelper.py b/yarnhelper.py index fa67a3c..e265d82 100644 --- a/yarnhelper.py +++ b/yarnhelper.py @@ -136,55 +136,12 @@ class YarnHelper(object): m.close() m.logout() - def ssh_keygen(self, user): # pragma: no cover - filename = self.ssh_key_file_for_user(user) - cliapp.runcmd(['ssh-keygen', '-f', filename, '-N', '', '-C', user]) - with open(filename + '.pub') as f: - return f.read() - - def ssh_key_file_for_user(self, user): # pragma: no cover - return os.path.abspath('{}.key'.format(user)) - def repo_ssh_url(self, repo): # pragma: no cover return 'ssh://git@{}/{}'.format(os.environ['GITANO_SERVER'], repo) def local_checkout_dirname(self, user, repo): # pragma: no cover return '{}_{}'.format(user, repo) - def git_as(self, user, args, **kwargs): # pragma: no cover - server = os.environ['GITANO_SERVER'] - env = dict(os.environ) - env['GIT_SSH_COMMAND'] = self.env_ssh_command(user) - return cliapp.runcmd_unchecked( - ['git'] + args, - stderr=subprocess.STDOUT, - env=env, - **kwargs) - - def git_as_checked(self, user, args, **kwargs): # pragma: no cover - exit, out, err = self.git_as(user, args, **kwargs) - sys.stdout.write('STDOUT from git:\n{}'.format(out)) - sys.stderr.write('STDERR from git:\n{}'.format(err)) - self.assertEqual(exit, 0) - - def env_ssh_command(self, user): # pragma: no cover - argv = [ - 'ssh', - '-o', 'PasswordAuthentication=no', - '-o', 'IdentitiesOnly=yes', - '-i', self.get_user_ssh_key(user), - ] - return ' '.join(argv) - - def get_admin_ssh_key(self): # pragma: no cover - return os.environ['ADMIN_SSH_KEY'] - - def get_user_ssh_key(self, user): # pragma: no cover - if user is None: - return self.get_admin_ssh_key() - else: - return self.ssh_key_file_for_user(user) - class Error(Exception): |