Merge remote-tracking branch 'mgukov/master'

This commit is contained in:
Jakobus Schürz 2021-10-02 19:41:20 +02:00
commit 74adca7e7e
22 changed files with 74 additions and 69 deletions

2
.gitignore vendored
View file

@ -5,3 +5,5 @@
/apidocs /apidocs
/gitosis/test/tmp /gitosis/test/tmp
/.coverage /.coverage
.idea
venv

View file

@ -1,5 +1,5 @@
import os, logging import os, logging
from ConfigParser import NoSectionError, NoOptionError from configparser import NoSectionError, NoOptionError
from gitosis import group from gitosis import group

View file

@ -3,7 +3,7 @@ import sys
import logging import logging
import optparse import optparse
import errno import errno
import ConfigParser import configparser
log = logging.getLogger('gitosis.app') log = logging.getLogger('gitosis.app')
@ -31,7 +31,7 @@ class App(object):
cfg = self.create_config(options) cfg = self.create_config(options)
try: try:
self.read_config(options, cfg) self.read_config(options, cfg)
except CannotReadConfigError, e: except CannotReadConfigError as e:
log.error(str(e)) log.error(str(e))
sys.exit(1) sys.exit(1)
self.setup_logging(cfg) self.setup_logging(cfg)
@ -53,13 +53,13 @@ class App(object):
return parser return parser
def create_config(self, options): def create_config(self, options):
cfg = ConfigParser.RawConfigParser() cfg = configparser.RawConfigParser()
return cfg return cfg
def read_config(self, options, cfg): def read_config(self, options, cfg):
try: try:
conffile = file(options.config) conffile = open(options.config)
except (IOError, OSError), e: except (IOError, OSError) as e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
# special case this because gitosis-init wants to # special case this because gitosis-init wants to
# ignore this particular error case # ignore this particular error case
@ -74,8 +74,8 @@ class App(object):
def setup_logging(self, cfg): def setup_logging(self, cfg):
try: try:
loglevel = cfg.get('gitosis', 'loglevel') loglevel = cfg.get('gitosis', 'loglevel')
except (ConfigParser.NoSectionError, except (configparser.NoSectionError,
ConfigParser.NoOptionError): configparser.NoOptionError):
pass pass
else: else:
try: try:

View file

@ -2,7 +2,7 @@ import errno
import logging import logging
import os import os
from ConfigParser import NoSectionError, NoOptionError from configparser import NoSectionError, NoOptionError
log = logging.getLogger('gitosis.gitdaemon') log = logging.getLogger('gitosis.gitdaemon')
@ -14,13 +14,13 @@ def export_ok_path(repopath):
def allow_export(repopath): def allow_export(repopath):
p = export_ok_path(repopath) p = export_ok_path(repopath)
file(p, 'a').close() open(p, 'a').close()
def deny_export(repopath): def deny_export(repopath):
p = export_ok_path(repopath) p = export_ok_path(repopath)
try: try:
os.unlink(p) os.unlink(p)
except OSError, e: except OSError as e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
pass pass
else: else:

View file

@ -27,7 +27,7 @@ To plug this into ``gitweb``, you have two choices.
import os, urllib, logging import os, urllib, logging
from ConfigParser import NoSectionError, NoOptionError from configparser import NoSectionError, NoOptionError
from gitosis import util from gitosis import util
@ -106,7 +106,7 @@ def generate_project_list(config, path):
""" """
tmp = '%s.%d.tmp' % (path, os.getpid()) tmp = '%s.%d.tmp' % (path, os.getpid())
f = file(tmp, 'w') f = open(tmp, 'w')
try: try:
generate_project_list_fp(config=config, fp=f) generate_project_list_fp(config=config, fp=f)
finally: finally:
@ -157,7 +157,7 @@ def set_descriptions(config):
'description', 'description',
) )
tmp = '%s.%d.tmp' % (path, os.getpid()) tmp = '%s.%d.tmp' % (path, os.getpid())
f = file(tmp, 'w') f = open(tmp, 'w')
try: try:
print >>f, description print >>f, description
finally: finally:

View file

@ -1,5 +1,5 @@
import logging import logging
from ConfigParser import NoSectionError, NoOptionError from configparser import NoSectionError, NoOptionError
def _getMembership(config, user, seen): def _getMembership(config, user, seen):
log = logging.getLogger('gitosis.group.getMembership') log = logging.getLogger('gitosis.group.getMembership')

View file

@ -9,8 +9,8 @@ import sys
import re import re
from pkg_resources import resource_filename from pkg_resources import resource_filename
from cStringIO import StringIO from io import StringIO
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from gitosis import repository from gitosis import repository
from gitosis import run_hook from gitosis import run_hook
@ -68,7 +68,7 @@ def symlink_config(git_dir):
tmp = '%s.%d.tmp' % (dst, os.getpid()) tmp = '%s.%d.tmp' % (dst, os.getpid())
try: try:
os.unlink(tmp) os.unlink(tmp)
except OSError, e: except OSError as e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
pass pass
else: else:
@ -94,15 +94,18 @@ def init_admin_repository(
# can't rely on setuptools and all kinds of distro packaging to # can't rely on setuptools and all kinds of distro packaging to
# have kept our templates executable, it seems # have kept our templates executable, it seems
os.chmod(os.path.join(git_dir, 'hooks', 'post-update'), 0755) os.chmod(os.path.join(git_dir, 'hooks', 'post-update'), 0o755)
if not repository.has_initial_commit(git_dir): if not repository.has_initial_commit(git_dir):
log.info('Making initial commit...') log.info('Making initial commit...')
# ConfigParser does not guarantee order, so jump through hoops # ConfigParser does not guarantee order, so jump through hoops
# to make sure [gitosis] is first # to make sure [gitosis] is first
cfg_file = StringIO() cfg_file = StringIO()
print >>cfg_file, '[gitosis]' print('[gitosis]', file=cfg_file)
print >>cfg_file #print('', end="", file=cfg_file)
#print >>cfg_file, '[gitosis]'
#print >>cfg_file
cfg = RawConfigParser() cfg = RawConfigParser()
cfg.add_section('group gitosis-admin') cfg.add_section('group gitosis-admin')
cfg.set('group gitosis-admin', 'members', user) cfg.set('group gitosis-admin', 'members', user)
@ -133,7 +136,7 @@ class Main(app.App):
def handle_args(self, parser, cfg, options, args): def handle_args(self, parser, cfg, options, args):
super(Main, self).handle_args(parser, cfg, options, args) super(Main, self).handle_args(parser, cfg, options, args)
os.umask(0022) os.umask(0o022)
log.info('Reading SSH public key...') log.info('Reading SSH public key...')
pubkey = read_ssh_pubkey() pubkey = read_ssh_pubkey()
@ -158,7 +161,7 @@ class Main(app.App):
user=user, user=user,
) )
log.info('Running post-update hook...') log.info('Running post-update hook...')
util.mkdir(os.path.expanduser('~/.ssh'), 0700) util.mkdir(os.path.expanduser('~/.ssh'), 0o700)
run_hook.post_update(cfg=cfg, git_dir=admin_repository) run_hook.post_update(cfg=cfg, git_dir=admin_repository)
log.info('Symlinking ~/.gitosis.conf to repository...') log.info('Symlinking ~/.gitosis.conf to repository...')
symlink_config(git_dir=admin_repository) symlink_config(git_dir=admin_repository)

View file

@ -36,7 +36,7 @@ def init(
if _git is None: if _git is None:
_git = 'git' _git = 'git'
util.mkdir(path, 0750) util.mkdir(path, 0o750)
args = [ args = [
_git, _git,
'--git-dir=.', '--git-dir=.',
@ -131,7 +131,7 @@ class GitCheckoutIndexError(GitExportError):
def export(git_dir, path): def export(git_dir, path):
try: try:
os.mkdir(path) os.mkdir(path)
except OSError, e: except OSError as e:
if e.errno == errno.EEXIST: if e.errno == errno.EEXIST:
pass pass
else: else:
@ -185,7 +185,7 @@ def has_initial_commit(git_dir):
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
close_fds=True, close_fds=True,
) )
got = child.stdout.read() got = child.stdout.read().decode('utf-8')
returncode = child.wait() returncode = child.wait()
if returncode != 0: if returncode != 0:
raise GitRevParseError('exit status %d' % returncode) raise GitRevParseError('exit status %d' % returncode)

View file

@ -19,7 +19,7 @@ def post_update(cfg, git_dir):
export = os.path.join(git_dir, 'gitosis-export') export = os.path.join(git_dir, 'gitosis-export')
try: try:
shutil.rmtree(export) shutil.rmtree(export)
except OSError, e: except OSError as e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
pass pass
else: else:
@ -63,7 +63,7 @@ class Main(app.App):
parser.error('Missing argument HOOK.') parser.error('Missing argument HOOK.')
log = logging.getLogger('gitosis.run_hook') log = logging.getLogger('gitosis.run_hook')
os.umask(0022) os.umask(0o022)
git_dir = os.environ.get('GIT_DIR') git_dir = os.environ.get('GIT_DIR')
if git_dir is None: if git_dir is None:

View file

@ -141,7 +141,7 @@ def serve(
p = topdir p = topdir
for segment in repopath.split(os.sep)[:-1]: for segment in repopath.split(os.sep)[:-1]:
p = os.path.join(p, segment) p = os.path.join(p, segment)
util.mkdir(p, 0750) util.mkdir(p, 0o750)
repository.init(path=fullpath) repository.init(path=fullpath)
gitweb.set_descriptions( gitweb.set_descriptions(
@ -178,7 +178,7 @@ class Main(app.App):
parser.error('Missing argument USER.') parser.error('Missing argument USER.')
main_log = logging.getLogger('gitosis.serve.main') main_log = logging.getLogger('gitosis.serve.main')
os.umask(0022) os.umask(0o022)
cmd = os.environ.get('SSH_ORIGINAL_COMMAND', None) cmd = os.environ.get('SSH_ORIGINAL_COMMAND', None)
if cmd is None: if cmd is None:
@ -197,7 +197,7 @@ class Main(app.App):
user=user, user=user,
command=cmd, command=cmd,
) )
except ServingError, e: except ServingError as e:
main_log.error('%s', e) main_log.error('%s', e)
sys.exit(1) sys.exit(1)

View file

@ -25,7 +25,7 @@ def readKeys(keydir):
continue continue
path = os.path.join(keydir, filename) path = os.path.join(keydir, filename)
f = file(path) f = open(path)
for line in f: for line in f:
line = line.rstrip('\n') line = line.rstrip('\n')
yield (basename, line) yield (basename, line)
@ -64,15 +64,15 @@ def writeAuthorizedKeys(path, keydir):
tmp = '%s.%d.tmp' % (path, os.getpid()) tmp = '%s.%d.tmp' % (path, os.getpid())
log.debug("writeAuthorizedKeys " + str(tmp) ) log.debug("writeAuthorizedKeys " + str(tmp) )
try: try:
in_ = file(path) in_ = open(path)
except IOError, e: except IOError as e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
in_ = None in_ = None
else: else:
raise raise
try: try:
out = file(tmp, 'w') out = open(tmp, 'w')
try: try:
if in_ is not None: if in_ is not None:
for line in filterAuthorizedKeys(in_): for line in filterAuthorizedKeys(in_):

View file

@ -1,7 +1,7 @@
from nose.tools import eq_ as eq from nose.tools import eq_ as eq
import logging import logging
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from gitosis import access from gitosis import access

View file

@ -1,7 +1,7 @@
from nose.tools import eq_ as eq from nose.tools import eq_ as eq
import os import os
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from gitosis import gitdaemon from gitosis import gitdaemon
from gitosis.test.util import maketemp, writeFile from gitosis.test.util import maketemp, writeFile

View file

@ -1,8 +1,8 @@
from nose.tools import eq_ as eq from nose.tools import eq_ as eq
import os import os
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from cStringIO import StringIO from io import StringIO
from gitosis import gitweb from gitosis import gitweb
from gitosis.test.util import mkdir, maketemp, readFile, writeFile from gitosis.test.util import mkdir, maketemp, readFile, writeFile

View file

@ -1,6 +1,6 @@
from nose.tools import eq_ as eq, assert_raises from nose.tools import eq_ as eq, assert_raises
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from gitosis import group from gitosis import group

View file

@ -2,7 +2,7 @@ from nose.tools import eq_ as eq
from gitosis.test.util import assert_raises, maketemp from gitosis.test.util import assert_raises, maketemp
import os import os
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from gitosis import init from gitosis import init
from gitosis import repository from gitosis import repository
@ -113,7 +113,7 @@ def test_init_admin_repository():
'hooks', 'hooks',
'post-update', 'post-update',
) )
util.check_mode(hook, 0755, is_file=True) util.check_mode(hook, 0o755, is_file=True)
got = util.readFile(hook).splitlines() got = util.readFile(hook).splitlines()
assert 'gitosis-run-hook post-update' in got assert 'gitosis-run-hook post-update' in got
export_dir = os.path.join(tmp, 'export') export_dir = os.path.join(tmp, 'export')

View file

@ -23,17 +23,17 @@ def test_init_simple():
tmp = maketemp() tmp = maketemp()
path = os.path.join(tmp, 'repo.git') path = os.path.join(tmp, 'repo.git')
repository.init(path) repository.init(path)
check_mode(path, 0750, is_dir=True) check_mode(path, 0o750, is_dir=True)
check_bare(path) check_bare(path)
def test_init_exist_dir(): def test_init_exist_dir():
tmp = maketemp() tmp = maketemp()
path = os.path.join(tmp, 'repo.git') path = os.path.join(tmp, 'repo.git')
mkdir(path, 0710) mkdir(path, 0o710)
check_mode(path, 0710, is_dir=True) check_mode(path, 0o710, is_dir=True)
repository.init(path) repository.init(path)
# my weird access mode is preserved # my weird access mode is preserved
check_mode(path, 0710, is_dir=True) check_mode(path, 0o710, is_dir=True)
check_bare(path) check_bare(path)
def test_init_exist_git(): def test_init_exist_git():
@ -41,7 +41,7 @@ def test_init_exist_git():
path = os.path.join(tmp, 'repo.git') path = os.path.join(tmp, 'repo.git')
repository.init(path) repository.init(path)
repository.init(path) repository.init(path)
check_mode(path, 0750, is_dir=True) check_mode(path, 0o750, is_dir=True)
check_bare(path) check_bare(path)
def test_init_templates(): def test_init_templates():
@ -53,7 +53,7 @@ def test_init_templates():
) )
# for reproducibility # for reproducibility
os.umask(0022) os.umask(0o022)
repository.init(path, template=templatedir) repository.init(path, template=templatedir)
repository.init(path) repository.init(path)
@ -61,7 +61,7 @@ def test_init_templates():
eq(got, 'i should show up\n') eq(got, 'i should show up\n')
check_mode( check_mode(
os.path.join(path, 'hooks', 'post-update'), os.path.join(path, 'hooks', 'post-update'),
0755, 0o755,
is_file=True, is_file=True,
) )
got = readFile(os.path.join(path, 'hooks', 'post-update')) got = readFile(os.path.join(path, 'hooks', 'post-update'))
@ -91,7 +91,7 @@ PATH="${PATH#*:}"
exec git "$@" exec git "$@"
''') ''')
os.chmod(mockgit, 0755) os.chmod(mockgit, 0o755)
magic_cookie = '%d' % random.randint(1, 100000) magic_cookie = '%d' % random.randint(1, 100000)
good_path = os.environ['PATH'] good_path = os.environ['PATH']
try: try:
@ -130,7 +130,7 @@ PATH="${PATH#*:}"
exec git "$@" exec git "$@"
''') ''')
os.chmod(mockgit, 0755) os.chmod(mockgit, 0o755)
magic_cookie = '%d' % random.randint(1, 100000) magic_cookie = '%d' % random.randint(1, 100000)
good_path = os.environ['PATH'] good_path = os.environ['PATH']
try: try:
@ -226,7 +226,7 @@ PATH="${PATH#*:}"
exec git "$@" exec git "$@"
''') ''')
os.chmod(mockgit, 0755) os.chmod(mockgit, 0o755)
repository.init(path=git_dir) repository.init(path=git_dir)
repository.fast_import( repository.fast_import(
git_dir=git_dir, git_dir=git_dir,
@ -301,7 +301,7 @@ PATH="${PATH#*:}"
exec git "$@" exec git "$@"
''') ''')
os.chmod(mockgit, 0755) os.chmod(mockgit, 0o755)
repository.init(path=tmp) repository.init(path=tmp)
repository.fast_import( repository.fast_import(
git_dir=tmp, git_dir=tmp,

View file

@ -1,8 +1,8 @@
from nose.tools import eq_ as eq from nose.tools import eq_ as eq
import os import os
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from cStringIO import StringIO from io import StringIO
from gitosis import init, repository, run_hook from gitosis import init, repository, run_hook
from gitosis.test.util import maketemp, readFile from gitosis.test.util import maketemp, readFile

View file

@ -3,8 +3,8 @@ from gitosis.test.util import assert_raises
import logging import logging
import os import os
from cStringIO import StringIO from io import StringIO
from ConfigParser import RawConfigParser from configparser import RawConfigParser
from gitosis import serve from gitosis import serve
from gitosis import repository from gitosis import repository
@ -354,7 +354,7 @@ def test_push_inits_subdir_parent_missing():
) )
eq(os.listdir(repositories), ['foo']) eq(os.listdir(repositories), ['foo'])
foo = os.path.join(repositories, 'foo') foo = os.path.join(repositories, 'foo')
util.check_mode(foo, 0750, is_dir=True) util.check_mode(foo, 0o750, is_dir=True)
eq(os.listdir(foo), ['bar.git']) eq(os.listdir(foo), ['bar.git'])
assert os.path.isfile(os.path.join(repositories, 'foo', 'bar.git', 'HEAD')) assert os.path.isfile(os.path.join(repositories, 'foo', 'bar.git', 'HEAD'))
@ -366,7 +366,7 @@ def test_push_inits_subdir_parent_exists():
os.mkdir(repositories) os.mkdir(repositories)
foo = os.path.join(repositories, 'foo') foo = os.path.join(repositories, 'foo')
# silly mode on purpose; not to be touched # silly mode on purpose; not to be touched
os.mkdir(foo, 0751) os.mkdir(foo, 0o751)
cfg.set('gitosis', 'repositories', repositories) cfg.set('gitosis', 'repositories', repositories)
generated = os.path.join(tmp, 'generated') generated = os.path.join(tmp, 'generated')
os.mkdir(generated) os.mkdir(generated)
@ -380,7 +380,7 @@ def test_push_inits_subdir_parent_exists():
command="git-receive-pack 'foo/bar.git'", command="git-receive-pack 'foo/bar.git'",
) )
eq(os.listdir(repositories), ['foo']) eq(os.listdir(repositories), ['foo'])
util.check_mode(foo, 0751, is_dir=True) util.check_mode(foo, 0o751, is_dir=True)
eq(os.listdir(foo), ['bar.git']) eq(os.listdir(foo), ['bar.git'])
assert os.path.isfile(os.path.join(repositories, 'foo', 'bar.git', 'HEAD')) assert os.path.isfile(os.path.join(repositories, 'foo', 'bar.git', 'HEAD'))

View file

@ -1,7 +1,7 @@
from nose.tools import eq_ as eq, assert_raises from nose.tools import eq_ as eq, assert_raises
import os import os
from cStringIO import StringIO from io import StringIO
from gitosis import ssh from gitosis import ssh
from gitosis.test.util import mkdir, maketemp, writeFile, readFile from gitosis.test.util import mkdir, maketemp, writeFile, readFile
@ -171,7 +171,7 @@ class WriteAuthorizedKeys_Test(object):
def test_simple(self): def test_simple(self):
tmp = maketemp() tmp = maketemp()
path = os.path.join(tmp, 'authorized_keys') path = os.path.join(tmp, 'authorized_keys')
f = file(path, 'w') f = open(path, 'w')
try: try:
f.write('''\ f.write('''\
# foo # foo

View file

@ -9,7 +9,7 @@ import sys
def mkdir(*a, **kw): def mkdir(*a, **kw):
try: try:
os.mkdir(*a, **kw) os.mkdir(*a, **kw)
except OSError, e: except OSError as e:
if e.errno == errno.EEXIST: if e.errno == errno.EEXIST:
pass pass
else: else:
@ -27,7 +27,7 @@ def maketemp():
tmp = os.path.join(tmp, name) tmp = os.path.join(tmp, name)
try: try:
shutil.rmtree(tmp) shutil.rmtree(tmp)
except OSError, e: except OSError as e:
if e.errno == errno.ENOENT: if e.errno == errno.ENOENT:
pass pass
else: else:
@ -37,7 +37,7 @@ def maketemp():
def writeFile(path, content): def writeFile(path, content):
tmp = '%s.tmp' % path tmp = '%s.tmp' % path
f = file(tmp, 'w') f = open(tmp, 'w')
try: try:
f.write(content) f.write(content)
finally: finally:
@ -45,7 +45,7 @@ def writeFile(path, content):
os.rename(tmp, path) os.rename(tmp, path)
def readFile(path): def readFile(path):
f = file(path) f = open(path)
try: try:
data = f.read() data = f.read()
finally: finally:
@ -58,7 +58,7 @@ def assert_raises(excClass, callableObj, *args, **kwargs):
""" """
try: try:
callableObj(*args, **kwargs) callableObj(*args, **kwargs)
except excClass, e: except excClass as e:
return e return e
else: else:
if hasattr(excClass,'__name__'): excName = excClass.__name__ if hasattr(excClass,'__name__'): excName = excClass.__name__

View file

@ -1,11 +1,11 @@
import errno import errno
import os import os
from ConfigParser import NoSectionError, NoOptionError from configparser import NoSectionError, NoOptionError
def mkdir(*a, **kw): def mkdir(*a, **kw):
try: try:
os.mkdir(*a, **kw) os.mkdir(*a, **kw)
except OSError, e: except OSError as e:
if e.errno == errno.EEXIST: if e.errno == errno.EEXIST:
pass pass
else: else: