annotate tests/dumbhttp.py @ 52217:96b113d22b34 stable

rust-update: handle SIGINT from long-running update threads The current code does not respond to ^C until after the Rust bit is finished doing its work. This is expected, since Rust holds the GIL for the duration of the call and does not call `PyErr_CheckSignals`. Freeing the GIL to do our work does not really improve anything since the Rust threads are still going, and the only way of cancelling a thread is by making it cooperate. So we do the following: - remember the SIGINT handler in hg-cpython and reset it after the call into core (see inline comment in `update.rs` about this) - make all update threads watch for a global `AtomicBool` being `true`, and if so stop their work - reset the global bool and exit early (i.e. before writing the dirstate) - raise SIGINT from `hg-cpython` if update returns `InterruptReceived`
author Raphaël Gomès <rgomes@octobus.net>
date Tue, 12 Nov 2024 12:52:13 +0100
parents 7332eae326de
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47500
23f5ed6dbcb1 run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45830
diff changeset
1 #!/usr/bin/env python
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
2
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
3
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
4 """
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
5 Small and dumb HTTP server for use in tests.
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
6 """
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
7
52114
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
8 import io
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
9 import optparse
31004
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
10 import os
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
11 import signal
31004
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
12 import socket
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
13 import sys
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
14
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
15 from mercurial import (
38593
e46c3b6a47b5 py3: fix dumbhttp.py to convert --daemon-postexec arguments back to bytes
Yuya Nishihara <yuya@tcha.org>
parents: 37672
diff changeset
16 encoding,
37672
8bacc09814ba py3: make values bytes before passing into server.runservice()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34944
diff changeset
17 pycompat,
30506
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 29566
diff changeset
18 server,
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28771
diff changeset
19 util,
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
20 )
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
21
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28771
diff changeset
22 httpserver = util.httpserver
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
23 OptionParser = optparse.OptionParser
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
24
52114
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
25 if pycompat.iswindows:
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
26 sys.stdout = io.TextIOWrapper(
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
27 sys.stdout.buffer,
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
28 sys.stdout.encoding,
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
29 sys.stdout.errors,
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
30 newline="\n",
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
31 )
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
32 sys.stderr = io.TextIOWrapper(
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
33 sys.stderr.buffer,
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
34 sys.stderr.encoding,
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
35 sys.stderr.errors,
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
36 newline="\n",
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
37 )
7332eae326de tests: force `dumbhttp.py` to write its log file with '\n' on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
38
31004
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
39 if os.environ.get('HGIPV6', '0') == '1':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
40
31004
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
41 class simplehttpserver(httpserver.httpserver):
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
42 address_family = socket.AF_INET6
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
43
31004
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
44 else:
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
45 simplehttpserver = httpserver.httpserver
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30506
diff changeset
46
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
47
34944
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
48 class _httprequesthandler(httpserver.simplehttprequesthandler):
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
49 def log_message(self, format, *args):
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
50 httpserver.simplehttprequesthandler.log_message(self, format, *args)
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
51 sys.stderr.flush()
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
52
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
53
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
54 class simplehttpservice:
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
55 def __init__(self, host, port):
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
56 self.address = (host, port)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
57
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
58 def init(self):
34944
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
59 self.httpd = simplehttpserver(self.address, _httprequesthandler)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
60
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
61 def run(self):
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
62 self.httpd.serve_forever()
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
63
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
64
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
65 if __name__ == '__main__':
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
66 parser = OptionParser()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
67 parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
68 '-p',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
69 '--port',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
70 dest='port',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
71 type='int',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
72 default=8000,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
73 help='TCP port to listen on',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
74 metavar='PORT',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
75 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
76 parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
77 '-H',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
78 '--host',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
79 dest='host',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
80 default='localhost',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
81 help='hostname or IP to listen on',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
82 metavar='HOST',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
83 )
34925
8b95e420e248 test-static-http: show all files accessed over HTTP
Yuya Nishihara <yuya@tcha.org>
parents: 31004
diff changeset
84 parser.add_option('--logfile', help='file name of access/error log')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
85 parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
86 '--pid',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
87 dest='pid',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
88 help='file name where the PID of the server is stored',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
89 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
90 parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
91 '-f',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
92 '--foreground',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
93 dest='foreground',
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
94 action='store_true',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
95 help='do not start the HTTP server in the background',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
96 )
28451
c90cfe76e024 serve: accept multiple values for --daemon-postexec
Jun Wu <quark@fb.com>
parents: 28194
diff changeset
97 parser.add_option('--daemon-postexec', action='append')
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
98
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
99 (options, args) = parser.parse_args()
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
100
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
101 signal.signal(signal.SIGTERM, lambda x, y: sys.exit(0))
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
102
34925
8b95e420e248 test-static-http: show all files accessed over HTTP
Yuya Nishihara <yuya@tcha.org>
parents: 31004
diff changeset
103 if options.foreground and options.logfile:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
104 parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
105 "options --logfile and --foreground are mutually " "exclusive"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
106 )
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
107 if options.foreground and options.pid:
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
108 parser.error("options --pid and --foreground are mutually exclusive")
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
109
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
110 opts = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
111 b'pid_file': options.pid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
112 b'daemon': not options.foreground,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
113 b'daemon_postexec': pycompat.rapply(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
114 encoding.strtolocal, options.daemon_postexec
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
115 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
116 }
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
117 service = simplehttpservice(options.host, options.port)
37672
8bacc09814ba py3: make values bytes before passing into server.runservice()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34944
diff changeset
118 runargs = [sys.executable, __file__] + sys.argv[1:]
8bacc09814ba py3: make values bytes before passing into server.runservice()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34944
diff changeset
119 runargs = [pycompat.fsencode(a) for a in runargs]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
120 server.runservice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
121 opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
122 initfn=service.init,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
123 runfn=service.run,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
124 logfile=options.logfile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
125 runargs=runargs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38593
diff changeset
126 )