##// END OF EJS Templates
changegroup: move file matcher from narrow extension...
changegroup: move file matcher from narrow extension Sparse changegroup generation requires the use of a matcher to filter which files are relevant. This commit moves the file matcher from the narrow extension to core and updates the narrow extension to use it. I'm not sure why the narrow extension was storing the matcher as a callable that resolved to a matcher. So I changed it to be a simple matcher instance. In addition, code from narrow to intersect the matcher with the local narrow spec is now performed automatically when the changegroup packer is created. If a matcher is not passed into getbundler() an alwaysmatcher() is assumed. This ensures that a matcher is always defined for all operations. Differential Revision: https://phab.mercurial-scm.org/D4011

File last commit:

r38678:531f5e93 default
r38818:9c057acb default
Show More
test-nointerrupt.t
83 lines | 2.0 KiB | text/troff | Tads3Lexer
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.uninterruptable():
> 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]