##// END OF EJS Templates
Added signature for changeset 411dc27fd9fd
Added signature for changeset 411dc27fd9fd

File last commit:

r47858:1d075b85 stable
r48358:29ea3b4c stable
Show More
test-nointerrupt.t
85 lines | 2.1 KiB | text/troff | Tads3Lexer
/ tests / test-nointerrupt.t
Matt Harbison
tests: disable test-nointerrupt on Windows...
r39515 #require no-windows
Augie Fackler
ui: add an uninterruptable context manager that can block SIGINT...
r38545 Dummy extension simulating unsafe long running command
$ cat > sleepext.py <<EOF
Augie Fackler
tests: properly sort imports in test-nointerrupt.t...
r38678 > import itertools
Augie Fackler
ui: add an uninterruptable context manager that can block SIGINT...
r38545 > import time
>
Augie Fackler
tests: properly sort imports in test-nointerrupt.t...
r38678 > from mercurial.i18n import _
Augie Fackler
ui: add an uninterruptable context manager that can block SIGINT...
r38545 > from mercurial import registrar
>
> cmdtable = {}
> command = registrar.command(cmdtable)
>
> @command(b'sleep', [], _(b'TIME'), norepo=True)
> def sleep(ui, sleeptime=b"1", **opts):
Kyle Lippincott
procutil: correct spelling of uninterruptable -> uninterruptible...
r41106 > with ui.uninterruptible():
Augie Fackler
ui: add an uninterruptable context manager that can block SIGINT...
r38545 > for _i in itertools.repeat(None, int(sleeptime)):
> time.sleep(1)
> ui.warn(b"end of unsafe operation\n")
> ui.warn(b"%s second(s) passed\n" % sleeptime)
> EOF
Kludge to emulate timeout(1) which is not generally available.
$ cat > timeout.py <<EOF
> from __future__ import print_function
> import argparse
> import signal
> import subprocess
> import sys
> import time
>
> ap = argparse.ArgumentParser()
> ap.add_argument('-s', nargs=1, default='SIGTERM')
> ap.add_argument('duration', nargs=1, type=int)
> ap.add_argument('argv', nargs='*')
> opts = ap.parse_args()
> try:
> sig = int(opts.s[0])
> except ValueError:
> sname = opts.s[0]
> if not sname.startswith('SIG'):
> sname = 'SIG' + sname
> sig = getattr(signal, sname)
> proc = subprocess.Popen(opts.argv)
> time.sleep(opts.duration[0])
> proc.poll()
> if proc.returncode is None:
> proc.send_signal(sig)
> proc.wait()
> sys.exit(124)
> EOF
Set up repository
$ hg init repo
$ cd repo
$ cat >> $HGRCPATH << EOF
> [extensions]
> sleepext = ../sleepext.py
> EOF
Test ctrl-c
Matt Harbison
tests: ensure `$PYTHON` is quoted for Windows...
r47858 $ "$PYTHON" $TESTTMP/timeout.py -s INT 1 hg sleep 2
Augie Fackler
ui: add an uninterruptable context manager that can block SIGINT...
r38545 interrupted!
[124]
$ cat >> $HGRCPATH << EOF
> [experimental]
> nointerrupt = yes
> EOF
Matt Harbison
tests: ensure `$PYTHON` is quoted for Windows...
r47858 $ "$PYTHON" $TESTTMP/timeout.py -s INT 1 hg sleep 2
Augie Fackler
ui: add an uninterruptable context manager that can block SIGINT...
r38545 interrupted!
[124]
$ cat >> $HGRCPATH << EOF
> [experimental]
> nointerrupt-interactiveonly = False
> EOF
Matt Harbison
tests: ensure `$PYTHON` is quoted for Windows...
r47858 $ "$PYTHON" $TESTTMP/timeout.py -s INT 1 hg sleep 2
Augie Fackler
ui: add an uninterruptable context manager that can block SIGINT...
r38545 shutting down cleanly
press ^C again to terminate immediately (dangerous)
end of unsafe operation
interrupted!
[124]