[PATCH 3 of 3 V2] dispatch: disable demandimport for the --debugger option

Augie Fackler raf at durin42.com
Fri May 29 09:13:55 CDT 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