tests/dumbhttp.py
author Matt Harbison <matt_harbison@yahoo.com>
Tue, 14 Apr 2020 18:51:23 -0400
changeset 44720 601ce5392cb0
parent 43076 2372284d9457
child 45830 c102b704edb5
permissions -rwxr-xr-x
phabricator: restack any new orphans created by phabsend (issue6045) Previously, posting a new review for a non head commit would orphan the head. The general case is any descendant of the selected revisions got orphaned if this was the first time the selected revisions were submitted. It doesn't happen when resubmitting. I've already had coworkers hit this a few times and get confused. Since posting a review isn't generally thought of as an editing operation, it would probably be easier for new users if we just restacked. This avoids restacking existing orphans around the submission because that may involve merge conflict resolution. Users who already have orphans should know how to stabilize them anyway. Differential Revision: https://phab.mercurial-scm.org/D8438

#!/usr/bin/env python

from __future__ import absolute_import

"""
Small and dumb HTTP server for use in tests.
"""

import optparse
import os
import signal
import socket
import sys

from mercurial import (
    encoding,
    pycompat,
    server,
    util,
)

httpserver = util.httpserver
OptionParser = optparse.OptionParser

if os.environ.get('HGIPV6', '0') == '1':

    class simplehttpserver(httpserver.httpserver):
        address_family = socket.AF_INET6


else:
    simplehttpserver = httpserver.httpserver


class _httprequesthandler(httpserver.simplehttprequesthandler):
    def log_message(self, format, *args):
        httpserver.simplehttprequesthandler.log_message(self, format, *args)
        sys.stderr.flush()


class simplehttpservice(object):
    def __init__(self, host, port):
        self.address = (host, port)

    def init(self):
        self.httpd = simplehttpserver(self.address, _httprequesthandler)

    def run(self):
        self.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('--logfile', help='file name of access/error log')
    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',
    )
    parser.add_option('--daemon-postexec', action='append')

    (options, args) = parser.parse_args()

    signal.signal(signal.SIGTERM, lambda x, y: sys.exit(0))

    if options.foreground and options.logfile:
        parser.error(
            "options --logfile and --foreground are mutually " "exclusive"
        )
    if options.foreground and options.pid:
        parser.error("options --pid and --foreground are mutually exclusive")

    opts = {
        b'pid_file': options.pid,
        b'daemon': not options.foreground,
        b'daemon_postexec': pycompat.rapply(
            encoding.strtolocal, options.daemon_postexec
        ),
    }
    service = simplehttpservice(options.host, options.port)
    runargs = [sys.executable, __file__] + sys.argv[1:]
    runargs = [pycompat.fsencode(a) for a in runargs]
    server.runservice(
        opts,
        initfn=service.init,
        runfn=service.run,
        logfile=options.logfile,
        runargs=runargs,
    )