revset: don't recreate matcher for every revision
The matcher variable 'm' in checkstatus() is reset to None on each
call, so the caching of the matcher no longer happens as it was
intended. This seems to be a regression in
ed7b674824a3 (revset: added
lazyset implementation to checkstatus, 2014-01-03).
Fix by moving the cached matcher into the enclosing function so it's
actually cached across calls. This speeds up
hg log -r 'modifies(mercurial/context.py)' >/dev/null
from 7.5s to 4s.
Also see similar fix in
f2aeff8a87b6 (revset: avoid recalculating
filesets, 2014-10-22).
#!/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()