changegroup: use a copy of hookargs when invoking the changegroup hook
addchangegroup creates a runhook function that is used to invoke the
changegroup and incoming hooks, but at the time the function is called,
the contents of hookargs associated with the transaction may have been
modified externally. For instance, bundle2 code affects it with
obsolescence markers and bookmarks info.
It also creates problems when a single transaction is used with multiple
changegroups added (as per an upcoming change), whereby the contents
of hookargs are that of after adding a latter changegroup when invoking
the hook for the first changegroup.
#!/usr/bin/env python
"""
Small and dumb HTTP server for use in tests.
"""
from optparse import OptionParser
import BaseHTTPServer, SimpleHTTPServer, os, signal, subprocess, sys
def run(server_class=BaseHTTPServer.HTTPServer,
handler_class=SimpleHTTPServer.SimpleHTTPRequestHandler,
server_address=('localhost', 8000)):
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
if __name__ == '__main__':
parser = OptionParser()
parser.add_option('-p', '--port', dest='port', type='int', default=8000,
help='TCP port to listen on', metavar='PORT')
parser.add_option('-H', '--host', dest='host', default='localhost',
help='hostname or IP to listen on', metavar='HOST')
parser.add_option('--pid', dest='pid',
help='file name where the PID of the server is stored')
parser.add_option('-f', '--foreground', dest='foreground',
action='store_true',
help='do not start the HTTP server in the background')
(options, args) = parser.parse_args()
signal.signal(signal.SIGTERM, lambda x, y: sys.exit(0))
if options.foreground and options.pid:
parser.error("options --pid and --foreground are mutually exclusive")
if options.foreground:
run(server_address=(options.host, options.port))
else:
# This doesn't attempt to cleanly detach the process, as it's not
# meant to be a long-lived, independent process. As a consequence,
# it's still part of the same process group, and keeps any file
# descriptors it might have inherited besided stdin/stdout/stderr.
# Trying to do things cleanly is more complicated, requires
# OS-dependent code, and is not worth the effort.
proc = subprocess.Popen([sys.executable, __file__, '-f',
'-H', options.host, '-p', str(options.port)],
stdin=open(os.devnull, 'r'),
stdout=open(os.devnull, 'w'),
stderr=subprocess.STDOUT)
if options.pid:
fp = file(options.pid, 'wb')
fp.write(str(proc.pid) + '\n')
fp.close()