##// END OF EJS Templates
extensions: register functions always at loading extension (issue5601)...
extensions: register functions always at loading extension (issue5601) Before this patch, functions defined in extensions are registered via extra loaders only in _dispatch(). Therefore, loading extensions in other code paths like below omits registration of functions. - WSGI service - operation across repositories (e.g. subrepo) - test-duplicateoptions.py, using extensions.loadall() directly To register functions always at loading new extension, this patch moves implementation for extra loading from dispatch._dispatch() to extensions.loadall(). AFAIK, only commands module causes cyclic dependency between extensions module, but this patch imports all related modules just before extra loading in loadall(), in order to centralize them. This patch makes extensions.py depend on many other modules, even though extensions.py itself doesn't. It should be avoided if possible, but I don't have any better idea. Some other places like below aren't reasonable for extra loading, IMHO. - specific function in newly added module: existing callers of extensions.loadall() should invoke it, too - hg.repository() or so: no-repo commands aren't covered by this. BTW, this patch removes _loaded.add(name) on relocation, because dispatch._loaded is used only for extraloaders (for similar reason, "exts" variable is removed, too).

File last commit:

r32337:46ba2cdd default
r33052:45b0e9d0 default
Show More
test-worker.t
128 lines | 3.0 KiB | text/troff | Tads3Lexer
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 Test UI worker interaction
$ cat > t.py <<EOF
> from __future__ import absolute_import, print_function
Jun Wu
test-worker: exercise more about "killworkers" situation...
r32114 > import time
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > from mercurial import (
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > error,
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 > registrar,
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > ui as uimod,
> worker,
> )
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > def abort(ui, args):
> if args[0] == 0:
> # by first worker for test stability
> raise error.Abort('known exception')
> return runme(ui, [])
Yuya Nishihara
worker: print traceback for uncaught exception unconditionally...
r32043 > def exc(ui, args):
> if args[0] == 0:
> # by first worker for test stability
> raise Exception('unknown exception')
> return runme(ui, [])
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > def runme(ui, args):
> for arg in args:
> ui.status('run\n')
> yield 1, arg
Jun Wu
test-worker: exercise more about "killworkers" situation...
r32114 > time.sleep(0.1) # easier to trigger killworkers code path
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > functable = {
> 'abort': abort,
Yuya Nishihara
worker: print traceback for uncaught exception unconditionally...
r32043 > 'exc': exc,
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > 'runme': runme,
> }
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > cmdtable = {}
Yuya Nishihara
registrar: move cmdutil.command to registrar module (API)...
r32337 > command = registrar.command(cmdtable)
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > @command('test', [], 'hg test [COST] [FUNC]')
> def t(ui, repo, cost=1.0, func='runme'):
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > cost = float(cost)
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > func = functable[func]
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > ui.status('start\n')
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 > runs = worker.worker(ui, cost, func, (ui,), range(8))
David Soria Parra
worker: flush ui buffers before running the worker...
r31696 > for n, i in runs:
> pass
> ui.status('done\n')
> EOF
$ abspath=`pwd`/t.py
$ hg init
Run tests with worker enable by forcing a heigh cost
$ hg --config "extensions.t=$abspath" test 100000.0
start
run
run
run
run
run
run
run
run
done
Run tests without worker by forcing a low cost
$ hg --config "extensions.t=$abspath" test 0.0000001
start
run
run
run
run
run
run
run
run
done
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041
Yuya Nishihara
test-worker: disable tests of forked workers on Windows...
r32061 #if no-windows
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 Known exception should be caught, but printed if --traceback is enabled
Jun Wu
test-worker: exercise more about "killworkers" situation...
r32114 $ hg --config "extensions.t=$abspath" --config 'worker.numcpus=8' \
> test 100000.0 abort 2>&1
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041 start
abort: known exception
Yuya Nishihara
worker: propagate exit code to main process...
r32042 [255]
Yuya Nishihara
dispatch: print traceback in scmutil.callcatch() if --traceback specified...
r32041
Jun Wu
test-worker: exercise more about "killworkers" situation...
r32114 $ hg --config "extensions.t=$abspath" --config 'worker.numcpus=8' \
Jun Wu
test-worker: capture tracebacks more reliably...
r32113 > test 100000.0 abort --traceback 2>&1 | egrep '^(SystemExit|Abort)'
Abort: known exception
SystemExit: 255
Yuya Nishihara
worker: print traceback for uncaught exception unconditionally...
r32043
Traceback must be printed for unknown exceptions
Jun Wu
test-worker: exercise more about "killworkers" situation...
r32114 $ hg --config "extensions.t=$abspath" --config 'worker.numcpus=8' \
Jun Wu
test-worker: capture tracebacks more reliably...
r32113 > test 100000.0 exc 2>&1 | grep '^Exception'
Exception: unknown exception
Yuya Nishihara
test-worker: disable tests of forked workers on Windows...
r32061
Jun Wu
worker: rewrite error handling so os._exit covers all cases...
r32112 Workers should not do cleanups in all cases
$ cat > $TESTTMP/detectcleanup.py <<EOF
> from __future__ import absolute_import
> import atexit
> import os
> import time
> oldfork = os.fork
> count = 0
> parentpid = os.getpid()
> def delayedfork():
> global count
> count += 1
> pid = oldfork()
> # make it easier to test SIGTERM hitting other workers when they have
> # not set up error handling yet.
> if count > 1 and pid == 0:
> time.sleep(0.1)
> return pid
> os.fork = delayedfork
> def cleanup():
> if os.getpid() != parentpid:
> os.write(1, 'should never happen\n')
> atexit.register(cleanup)
> EOF
$ hg --config "extensions.t=$abspath" --config worker.numcpus=8 --config \
> "extensions.d=$TESTTMP/detectcleanup.py" test 100000 abort
start
abort: known exception
[255]
Yuya Nishihara
test-worker: disable tests of forked workers on Windows...
r32061 #endif