diff options
author | Richard Maw <richard.maw@codethink.co.uk> | 2014-08-28 14:00:52 +0000 |
---|---|---|
committer | Richard Maw <richard.maw@codethink.co.uk> | 2014-08-28 14:00:52 +0000 |
commit | 9c0011417081326ebb72d9ed02fcbbc456946dc4 (patch) | |
tree | 5ea1ba505bb50ee616567f74551aadb2b51fa0d3 /scripts/git-daemon-wrap | |
parent | 8c9aea626d1308a876d145d379ac5f23905fa9b4 (diff) | |
parent | 1edbc9f5c08daafb3e13131dfc8df656b2a02edc (diff) | |
download | morph-9c0011417081326ebb72d9ed02fcbbc456946dc4.tar.gz |
Merge branch 'baserock/richardmaw/yarn-git-daemon'
Reviewed-by: Lars Wirzenius (git-daemon)
Reviewed-by: Sam Thursfield (yarn fixup)
Diffstat (limited to 'scripts/git-daemon-wrap')
-rwxr-xr-x | scripts/git-daemon-wrap | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/scripts/git-daemon-wrap b/scripts/git-daemon-wrap new file mode 100755 index 00000000..528b7bed --- /dev/null +++ b/scripts/git-daemon-wrap @@ -0,0 +1,46 @@ +#!/usr/bin/python + +'Launch a Git Daemon on an ephemeral port, and report which port was used.' + +import argparse +import contextlib +import pipes +import socket +import subprocess +import sys + +# Parse arguments with bare argparse, since cliapp hates unknown options +class UnsupportedArgument(argparse.Action): + def __call__(self, parser, namespace, values, option_string=None): + sys.stderr.write('%s not supported\n' % option_string) + sys.exit(1) + +parser = argparse.ArgumentParser(description=__doc__) +for arg in ('user', 'group', 'detach', 'port', 'syslog', 'pid-file'): + parser.add_argument('--' + arg, action=UnsupportedArgument) +parser.add_argument('--listen', default='127.0.0.1') +parser.add_argument('--port-file', required=True, + help='Report which port the git daemon was bound to.') +options, args = parser.parse_known_args() + +with contextlib.closing(socket.socket()) as sock: + sock.bind((options.listen, 0)) + host, port = sock.getsockname() + with open(options.port_file, 'w') as f: + f.write('%s\n' % port) + sock.listen(1) + while True: + conn, addr = sock.accept() + with contextlib.closing(conn): + gitcmd = ['git', 'daemon', '--inetd'] + gitcmd.extend(args) + cmdstr = (' '.join(map(pipes.quote, gitcmd))) + sys.stderr.write('Running %s' % cmdstr) + ret = subprocess.call(args=gitcmd, stdin=conn, stdout=conn, + stderr=conn, close_fds=True) + if ret != 0: + sys.stderr.write('%s exited %d\n' % (cmdstr, ret)) + # git-daemon returns 255 when the repo doesn't exist + if ret not in (0, 255): + break +sys.exit(ret) |