Patchwork [2,of,3] extensions: show traceback on load failure if --traceback flag is set

login
register
mail settings
Submitter Yuya Nishihara
Date May 31, 2015, 6:19 a.m.
Message ID <37bd00295cac9a7144dc.1433053182@mimosa>
Download mbox | patch
Permalink /patch/9405/
State Accepted
Headers show

Comments

Yuya Nishihara - May 31, 2015, 6:19 a.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1427700215 -32400
#      Mon Mar 30 16:23:35 2015 +0900
# Node ID 37bd00295cac9a7144dc7ca685a4fe201b95a860
# Parent  ee6f870cc800d5aa585a0bafc2110ecb93a18ed3
extensions: show traceback on load failure if --traceback flag is set

Before this patch, there was no handy way to investigate the reason why
extension couldn't be loaded.

If ui.debug is set, tracebacks of both "hgext.foo" and "foo" are displayed
because the first ImportError could occur at very deep dependency module.

Patch

diff --git a/mercurial/extensions.py b/mercurial/extensions.py
--- a/mercurial/extensions.py
+++ b/mercurial/extensions.py
@@ -85,6 +85,8 @@  def load(ui, name, path):
         except ImportError, err:
             ui.debug('could not import hgext.%s (%s): trying %s\n'
                      % (name, err, name))
+            if ui.debugflag:
+                ui.traceback()
             mod = importh(name)
     _extensions[shortname] = mod
     _order.append(shortname)
@@ -110,6 +112,7 @@  def loadall(ui):
             else:
                 ui.warn(_("*** failed to import extension %s: %s\n")
                         % (name, inst))
+            ui.traceback()
 
     for name in _order[newindex:]:
         uisetup = getattr(_extensions[name], 'uisetup', None)
diff --git a/tests/test-bad-extension.t b/tests/test-bad-extension.t
--- a/tests/test-bad-extension.t
+++ b/tests/test-bad-extension.t
@@ -15,3 +15,32 @@ 
   hg help [-ec] [TOPIC]
   
   show help for a given topic or a help overview
+
+show traceback
+
+  $ hg -q help help --traceback 2>&1 | grep -v '^  '
+  *** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
+  Traceback (most recent call last):
+  Exception: bit bucket overflow
+  *** failed to import extension badext2: No module named badext2
+  Traceback (most recent call last):
+  ImportError: No module named badext2
+  hg help [-ec] [TOPIC]
+  
+  show help for a given topic or a help overview
+
+show traceback for ImportError of hgext.name if debug is set
+(note that --debug option isn't applied yet when loading extensions)
+
+  $ hg help help --traceback --config ui.debug=True 2>&1 \
+  > | grep -v '^  ' | head -n10
+  *** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
+  Traceback (most recent call last):
+  Exception: bit bucket overflow
+  could not import hgext.badext2 (No module named badext2): trying badext2
+  Traceback (most recent call last):
+  ImportError: No module named badext2
+  *** failed to import extension badext2: No module named badext2
+  Traceback (most recent call last):
+  ImportError: No module named badext2
+  hg help [-ec] [TOPIC]