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

Augie Fackler raf at durin42.com
Tue Mar 7 22:01:05 EST 2017


> On Mar 7, 2017, at 21:59, Durham Goode <durham at fb.com> wrote:
> 
> 
> 
> On 3/7/17 8:25 AM, Augie Fackler wrote:
>> # HG changeset patch
>> # User Augie Fackler <raf at durin42.com>
>> # Date 1488568082 18000
>> #      Fri Mar 03 14:08:02 2017 -0500
>> # Node ID adf7419abb89aef332ac5eac48a0f1c9d3eab527
>> # Parent  3e82376d7d3f3e11d11f09fceb8b4c79233057a8
>> 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,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
> 
> Should this have outputted an error?

D'oh. I must have missed something here. I'll take a look in the morning (it's late here) and do a resend.



More information about the Mercurial-devel mailing list