[PATCH 1 of 6 py3 v4] extensions: tapdance to get reasonable import error formatting

Augie Fackler raf at durin42.com
Sat Mar 11 19:39:13 UTC 2017


# HG changeset patch
# User Augie Fackler <raf at durin42.com>
# Date 1488568082 18000
#      Fri Mar 03 14:08:02 2017 -0500
# Node ID f498eb177f8d15d967f53ccc2a37fad5a2b785a4
# Parent  295625f1296bda9c507b9025177c4f2452408cc3
extensions: tapdance to get reasonable import error formatting

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

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,18 @@ 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 encoding.tolocal(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))
+             % (failed, _forbytes(err), next))
     if ui.debugflag:
         ui.traceback()
 
@@ -168,6 +176,7 @@ 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))


More information about the Mercurial-devel mailing list