Patchwork [3,of,6,py3,v2] extensions: tapdance to get reasonable import error formatting

login
register
mail settings
Submitter Augie Fackler
Date March 8, 2017, 10:51 p.m.
Message ID <9bd5ccf35922ec4e70a2.1489013477@augie-macbookair2.roam.corp.google.com>
Download mbox | patch
Permalink /patch/19027/
State Superseded
Headers show

Comments

Augie Fackler - March 8, 2017, 10:51 p.m.
# HG changeset patch
# User Augie Fackler <raf@durin42.com>
# Date 1488568082 18000
#      Fri Mar 03 14:08:02 2017 -0500
# Node ID 9bd5ccf35922ec4e70a2f024f1291646b3bb6c18
# Parent  009c8aeb34d4f226ba15c54b37dbe8fb86cc103b
extensions: tapdance to get reasonable import error formatting

I'm not thrilled with this, but it seems to work.

Patch

diff --git a/mercurial/extensions.py b/mercurial/extensions.py
--- a/mercurial/extensions.py
+++ b/mercurial/extensions.py
@@ -18,6 +18,7 @@  from .i18n import (
 
 from . import (
     cmdutil,
+    encoding,
     error,
     pycompat,
     util,
@@ -104,11 +105,19 @@  def _importext(name, path=None, reportfu
                 mod = _importh(name)
     return mod
 
+def _forbytes(inst):
+    """Portably format an import error into a form suitable for
+    %-formatting into bytestrings."""
+    if pycompat.ispy3:
+        return str(inst).encode('utf-8')
+    return inst
+
 def _reportimporterror(ui, err, failed, next):
     # note: this ui.debug happens before --debug is processed,
     #       Use --config ui.debug=1 to see them.
-    ui.debug('could not import %s (%s): trying %s\n'
-             % (failed, err, next))
+    msg = 'could not import %s (%s): trying %s\n' % (
+        failed, _forbytes(err), next)
+    ui.debug(encoding.tolocal(msg))
     if ui.debugflag:
         ui.traceback()
 
@@ -168,12 +177,13 @@  def loadall(ui):
         except KeyboardInterrupt:
             raise
         except Exception as inst:
+            inst = _forbytes(inst)
             if path:
-                ui.warn(_("*** failed to import extension %s from %s: %s\n")
-                        % (name, path, inst))
+                fmt = _("*** failed to import extension %s from %s: %s\n")
+                ui.warn(encoding.tolocal(fmt % (name, path, inst)))
             else:
-                ui.warn(_("*** failed to import extension %s: %s\n")
-                        % (name, inst))
+                fmt = _("*** failed to import extension %s: %s\n")
+                ui.warn(encoding.tolocal(fmt % (name, inst)))
             ui.traceback()
 
     for name in _order[newindex:]:
diff --git a/tests/test-check-py3-commands.t b/tests/test-check-py3-commands.t
--- a/tests/test-check-py3-commands.t
+++ b/tests/test-check-py3-commands.t
@@ -12,3 +12,12 @@  The full traceback is hidden to have a s
   warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
   debuginstall
   TypeError: Can't convert 'bytes' object to str implicitly
+
+  $ cat > included-hgrc <<EOF
+  > [extensions]
+  > babar = imaginary_elephant
+  > EOF
+  $ cat >> $HGRCPATH <<EOF
+  > %include $TESTTMP/included-hgrc
+  > EOF
+  $ $PYTHON3 `which hg` version --config ui.debug=1