view tests/test-nointerrupt.t @ 46370:cad17d50736c

changelog: move branchinfo to changelogrevision The function parses the extra dictionary after looking up the changelogrevision. To avoid duplicated look up, it is better to provide it as property of changelogrevision instead. Keep the function for a release cycle as at least the topic extension depends on it. Differential Revision: https://phab.mercurial-scm.org/D9779
author Joerg Sonnenberger <joerg@bec.de>
date Fri, 15 Jan 2021 01:30:08 +0100
parents 0826d684a1b5
children 1d075b857c90
line wrap: on
line source

#require no-windows

Dummy extension simulating unsafe long running command
  $ cat > sleepext.py <<EOF
  > import itertools
  > import time
  > 
  > from mercurial.i18n import _
  > from mercurial import registrar
  > 
  > cmdtable = {}
  > command = registrar.command(cmdtable)
  > 
  > @command(b'sleep', [], _(b'TIME'), norepo=True)
  > def sleep(ui, sleeptime=b"1", **opts):
  >     with ui.uninterruptible():
  >         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
  $ $PYTHON $TESTTMP/timeout.py -s INT 1 hg sleep 2
  interrupted!
  [124]

  $ cat >> $HGRCPATH << EOF
  > [experimental]
  > nointerrupt = yes
  > EOF

  $ $PYTHON $TESTTMP/timeout.py -s INT 1 hg sleep 2
  interrupted!
  [124]

  $ cat >> $HGRCPATH << EOF
  > [experimental]
  > nointerrupt-interactiveonly = False
  > EOF

  $ $PYTHON $TESTTMP/timeout.py -s INT 1 hg sleep 2
  shutting down cleanly
  press ^C again to terminate immediately (dangerous)
  end of unsafe operation
  interrupted!
  [124]