[PATCH 3 of 3 V2] dispatch: disable demandimport for the --debugger option
Augie Fackler
raf at durin42.com
Fri May 29 14:13:55 UTC 2015
On Thu, May 28, 2015 at 04:44:33PM -0400, Jordi Gutiérrez Hermoso wrote:
> # HG changeset patch
> # User Jordi Gutiérrez Hermoso <jordigh at octave.org>
> # Date 1432845741 14400
> # Thu May 28 16:42:21 2015 -0400
> # Node ID 92881f06e157c5123b3b5949d9145ba7809ae165
> # Parent 8ba3d6abebd87af2166b84936a45df850af86dad
> dispatch: disable demandimport for the --debugger option
Queued these, thanks!
>
> Something in Python 2.7.9 or so broke the --debugger option with
> ui.debugger = ipdb. I get the traceback below. There is some apparent
> confusion with demandimport. This should be disabled anyway for the
> --debugger option. The debugger must be imported right away, before
> any other dispatch. There's no benefit in delaying the debugger
> import.
>
> This patch uses the demandimport.deactivated() context manager.
>
> Traceback (most recent call last):
> File "/usr/lib/python2.7/dist-packages/mercurial/dispatch.py", line 121, in _runcatch
> debugmod = __import__(debugger)
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 115, in _demandimport
> return _hgextimport(_import, name, globals, locals, fromlist, level)
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 47, in _hgextimport
> return importfunc(name, globals, *args)
> File "/usr/lib/python2.7/dist-packages/ipdb/__init__.py", line 16, in <module>
> from ipdb.__main__ import set_trace, post_mortem, pm, run, runcall, runeval, launch_ipdb_on_exception
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 134, in _demandimport
> mod = _hgextimport(_origimport, name, globals, locals)
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 47, in _hgextimport
> return importfunc(name, globals, *args)
> File "/usr/lib/python2.7/dist-packages/ipdb/__main__.py", line 29, in <module>
> if IPython.__version__ > '0.10.2':
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 106, in __getattribute__
> self._load()
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 78, in _load
> mod = _hgextimport(_import, head, globals, locals, None, level)
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 47, in _hgextimport
> return importfunc(name, globals, *args)
> File "/usr/lib/python2.7/dist-packages/IPython/__init__.py", line 45, in <module>
> from .config.loader import Config
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 132, in _demandimport
> return _origimport(name, globals, locals, fromlist, level)
> File "/usr/lib/python2.7/dist-packages/IPython/config/__init__.py", line 16, in <module>
> from .application import *
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 115, in _demandimport
> return _hgextimport(_import, name, globals, locals, fromlist, level)
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 47, in _hgextimport
> return importfunc(name, globals, *args)
> File "/usr/lib/python2.7/dist-packages/IPython/config/application.py", line 30, in <module>
> from IPython.external.decorator import decorator
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 134, in _demandimport
> mod = _hgextimport(_origimport, name, globals, locals)
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 47, in _hgextimport
> return importfunc(name, globals, *args)
> File "/usr/lib/python2.7/dist-packages/IPython/external/decorator/__init__.py", line 2, in <module>
> from decorator import *
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 115, in _demandimport
> return _hgextimport(_import, name, globals, locals, fromlist, level)
> File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 47, in _hgextimport
> return importfunc(name, globals, *args)
> File "/usr/lib/python2.7/dist-packages/decorator.py", line 240, in <module>
> 'ContextManager', (_GeneratorContextManager,), dict(__call__=__call__))
>
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -11,6 +11,7 @@ import difflib
> import util, commands, hg, fancyopts, extensions, hook, error
> import cmdutil, encoding
> import ui as uimod
> +import demandimport
>
> class request(object):
> def __init__(self, args, ui=None, repo=None, fin=None, fout=None,
> @@ -137,10 +138,11 @@ def _runcatch(req):
> # This import can be slow for fancy debuggers, so only
> # do it when absolutely necessary, i.e. when actual
> # debugging has been requested
> - try:
> - debugmod = __import__(debugger)
> - except ImportError:
> - pass # Leave debugmod = pdb
> + with demandimport.deactivated():
> + try:
> + debugmod = __import__(debugger)
> + except ImportError:
> + pass # Leave debugmod = pdb
>
> debugtrace[debugger] = debugmod.set_trace
> debugmortem[debugger] = debugmod.post_mortem
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list