summaryrefslogtreecommitdiff
path: root/scripts/git-daemon-wrap
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2014-08-28 14:00:52 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2014-08-28 14:00:52 +0000
commit9c0011417081326ebb72d9ed02fcbbc456946dc4 (patch)
tree5ea1ba505bb50ee616567f74551aadb2b51fa0d3 /scripts/git-daemon-wrap
parent8c9aea626d1308a876d145d379ac5f23905fa9b4 (diff)
parent1edbc9f5c08daafb3e13131dfc8df656b2a02edc (diff)
downloadmorph-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-xscripts/git-daemon-wrap46
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)