[PATCH] debugshell: disable demand importer when importing debugger

Gregory Szorc gregory.szorc at gmail.com
Mon Jan 11 20:25:56 CST 2016

# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1452564998 28800
#      Mon Jan 11 18:16:38 2016 -0800
# Node ID 7e2276ca61d80c04e8838e502f42304be2e70aa9
# Parent  4571c0b383378f5eec5189e3a39c672a169ce566
debugshell: disable demand importer when importing debugger

For reasons I can't explain (but likely have something to do with a
combination of __import__ inferring default values for arguments and
the demand importer mechanism further assuming defaults), the demand
importer isn't playing well with IPython. Without this patch, we get
a failure "ValueError: Attempted relative import in non-package" when
attempting to import "IPython." The stack has numerous demandimport
calls on it and adding "IPython" to the exclude list in demandimport
isn't enough to make the problem go away, which means the issue is
likely somewhere in the bowells of IPython. It's easier to just disable
the demand importer when importing the debugger.

diff --git a/contrib/debugshell.py b/contrib/debugshell.py
--- a/contrib/debugshell.py
+++ b/contrib/debugshell.py
@@ -3,9 +3,12 @@
 import sys
 import mercurial
 import code
-from mercurial import cmdutil
+from mercurial import (
+    cmdutil,
+    demandimport,
 cmdtable = {}
 command = cmdutil.command(cmdtable)
@@ -44,9 +47,10 @@ def debugshell(ui, repo, **opts):
         debugger = 'pdb'
     # if IPython doesn't exist, fallback to code.interact
-        __import__(pdbmap[debugger])
+        with demandimport.deactivated():
+            __import__(pdbmap[debugger])
     except ImportError:
         ui.warn("%s debugger specified but %s module was not found\n"
                 % (debugger, pdbmap[debugger]))
         debugger = 'pdb'

More information about the Mercurial-devel mailing list