Patchwork [3,of,3] dispatch: disable demandimport for the --debugger option

login
register
mail settings
Submitter Jordi Gutiérrez Hermoso
Date May 26, 2015, 8:35 p.m.
Message ID <b8ea0c42b6db7aed9071.1432672502@Iris>
Download mbox | patch
Permalink /patch/9289/
State Superseded
Commit 101e84121c136f01ecafbba086787ead51ed1913
Headers show

Comments

Jordi Gutiérrez Hermoso - May 26, 2015, 8:35 p.m.
# HG changeset patch
# User Jordi Gutiérrez Hermoso <jordigh@octave.org>
# Date 1432672165 14400
#      Tue May 26 16:29:25 2015 -0400
# Node ID b8ea0c42b6db7aed90713408d50833d19553385f
# Parent  f80655710170e55cd8bd36a23802a4ad85ac73aa
dispatch: disable demandimport for the --debugger option

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.importnow() 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__))
Augie Fackler - May 27, 2015, 2:52 p.m.
On Tue, May 26, 2015 at 04:35:02PM -0400, Jordi Gutiérrez Hermoso wrote:
> # HG changeset patch
> # User Jordi Gutiérrez Hermoso <jordigh@octave.org>
> # Date 1432672165 14400
> #      Tue May 26 16:29:25 2015 -0400
> # Node ID b8ea0c42b6db7aed90713408d50833d19553385f
> # Parent  f80655710170e55cd8bd36a23802a4ad85ac73aa
> dispatch: disable demandimport for the --debugger option

modulo the nits on patch 1, I'm very happy with this series - I look forward to v2. 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.importnow() 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.importnow():
> +                    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@selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel

Patch

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.importnow():
+                    try:
+                        debugmod = __import__(debugger)
+                    except ImportError:
+                        pass # Leave debugmod = pdb
 
             debugtrace[debugger] = debugmod.set_trace
             debugmortem[debugger] = debugmod.post_mortem